Сегодня речь пойдет о зависимостях некоторых объектов базы данных от столбцов таблиц. В частности, ограничений целостности типа проверки и вычисляемых полей. Как то раз мне понадобилось написать хранимую процедуру, которая меняет тип данных у столбца. Надо сказать эта работа оказалась трудоемкой. При изменении типа данных столбца серверный код собирал информацию обо всех индексах и ограничениях целостности, в которых участвует столбец с тем, чтобы проверить возможность их воссоздания на столбце нового типа. Серверный код выполняет эти проверки для ограничений и индексов всех типов. И когда я дошел до ограничений целостности типа 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 [Столбец]
fromsys.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 [Столбец]
fromsys.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.
Комментариев нет:
Отправить комментарий