Страницы

понедельник, 5 мая 2014 г.

Зависимости между объектами баз данных

Сегодня речь пойдет о зависимостях некоторых объектов базы данных от столбцов таблиц. В частности, ограничений целостности типа проверки и вычисляемых полей. Как то раз мне понадобилось написать хранимую процедуру, которая меняет тип данных у столбца. Надо сказать эта работа оказалась трудоемкой. При изменении типа данных столбца серверный код собирал информацию обо всех индексах и ограничениях целостности, в которых участвует столбец с тем, чтобы проверить возможность их воссоздания на столбце нового типа. Серверный код выполняет эти проверки для ограничений и индексов всех типов. И когда я дошел до ограничений целостности типа check, то встал следующий вопрос. Как определить участвует ли данный столбец в имеющемся у таблицы ограничении целостности типа check. Сперва я полез в системный каталог sys.check_constraints. Но в этом каталоге содержится лишь общая информация об ограничении, а также его текст. Однако писать парсер для текста ограничения задача трудоемкая. Поэтому можно воспользоваться замечательным каталогом sys.sql_dependencies. В нем имеются поля для идентификатора ограничения целостности и для идентификатора родительской сущности, то есть таблицы. Также в нем присутствует поле referenced_minor_id, которое в данном случае дает идентификатор столбца. Для определения всей необходимой информации об ограничениях типа check в базе данных, можно воспользоваться таким запросом:
select quotename ( schema_name ( tab.[schema_id] ) ) + N'.' + quotename ( tab.name ) [Таблица], con.name [Ограничение], con.[definition] [Определение], col.name [Столбец]
from
       sys.tables tab
             inner join
       sys.check_constraints con on tab.[object_id] = con.parent_object_id
             inner join
       sys.sql_dependencies dep on con.[object_id] = dep.[object_id]
             inner join
       sys.columns col on
             tab.[object_id] = col.[object_id] and
             col.column_id = dep.referenced_minor_id

В этом запросе мы получаем и имя таблицы и данные об ограничении (имя и определение) и имена участвующих столбов.

Можно изменить этот запрос, чтобы получать данные о том, от каких столбцов зависит тот или иной вычисляемый столбец:
select quotename ( schema_name ( tab.[schema_id] ) ) + N'.' + quotename ( tab.name ) [Таблица], comp.name [Ограничение], comp.[definition] [Определение], col.name [Столбец]
from
       sys.computed_columns comp
             inner join
       sys.tables tab on tab.[object_id] = comp.[object_id]
             inner join
       sys.sql_dependencies dep on comp.[object_id] = dep.[object_id]
             inner join
       sys.columns col on
             tab.[object_id] = col.[object_id] and
             col.column_id = dep.referenced_minor_id

Для получения информации о том, от каких столбцов зависят ограничения типа unique, foreign key, default можно использовать соответственно каталоги sys.index_columns, sys.foreign_key_columns, sys.default_constraints.

Комментариев нет:

Отправить комментарий