Отношения SQL Server похоронены в хранимых процедурах, а не в схеме
В настоящее время у нас очень мало ссылочной целостности, а также имеется несколько таблиц, которые объединяются самостоятельно (и, возможно, лучше было бы представить их как отдельные таблицы или объединенные представления).
Знание того, как эти таблицы связаны друг с другом, подразумевается в логике хранимых процедур, а не явно в схеме. Мы рассматриваем возможность изменить это.
Первый шаг - это понять неявные отношения и задокументировать их.
Итак, мой вопрос...
Каков наилучший способ извлечь эту скрытую информацию, если не считать, что все хранимые процедуры выглядят гладко? Я рассмотрю любые инструменты, напишу свой собственный SQL для опроса системных таблиц или использую модель SQL-DMO - или фактически что-нибудь под солнцем, которое позволяет компьютеру выполнять больше работы, а я - меньше.
3 ответа
Если отношения идентифицируются только объединениями в SP, то вам не повезет, если вы автоматизируете их.
Может быть целесообразно захватывать запросы с помощью профилировщика, чтобы сначала найти наиболее частые объединения.
Когда дело доходит до рефакторинга, я старая школа:
- Документируйте, что у вас есть, используйте визуальный инструмент.
- Опишите - в письменной форме - бизнес-модель, которую захватывает эта база данных.
- Подберите сущности из существительных описания и имеющейся у вас схемы.
- Создать новую модель ER; проконсультируйтесь с бизнесом, пока у него.
- Создать новую БД на основе ER
- Данные ETL передаются в новую базу данных и тестируются.
Ты можешь использовать sys.sql_dependencies
узнать, от каких столбцов и таблиц зависит SP (помогает, если вы этого не делаете SELECT *
в ваших ИП). Это поможет вам получить список кандидатов по крайней мере:
referenced_major_id == the OBJECT_ID of the table
referenced_minor_id == the column id: COLUMNPROPERTY(referenced_major_id,
COLUMN_NAME,
'ColumnId')
Возможно, вам придется использовать sp_refreshsqlmodule
чтобы убедиться, что зависимости обновлены, чтобы это работало. т.е. если вы измените представление, вам нужно sp_refreshsqlmodule
на каждом не связанном со схемой модуле (очевидно, что связанные со схемой модули не допускают каких-либо изменений, лежащих в основе изменений, - но вы получите ошибку, если вы вызовете sp_refreshsqlmodule
на объект, связанный со схемой), который зависел от этого представления. Вы можете автоматизировать это, позвонив sp_refreshsqlmodule
на этих объектах:
SELECT *
FROM INFORMATION_SCHEMA.ROUTINES
WHERE OBJECTPROPERTY(OBJECT_ID(QUOTENAME(ROUTINE_SCHEMA) + '.'
+ QUOTENAME(ROUTINE_NAME)),
N'IsSchemaBound') IS NULL
OR OBJECTPROPERTY(OBJECT_ID(QUOTENAME(ROUTINE_SCHEMA) + '.'
+ QUOTENAME(ROUTINE_NAME)),
N'IsSchemaBound') = 0