嵌入在存储过程而不是模式中的SQL Server关系
问题描述:
目前我们只有很少的参照完整性,并且有许多自连接的表(实际上可能会更好地表示为单独的表或连接的视图) 。嵌入在存储过程而不是模式中的SQL Server关系
有关这些表彼此之间的相互关系的知识隐含在存储过程的逻辑中,而不是在模式中显式表示。我们正在考虑改变这一点。
第一步是真正理解隐式关系并记录它们。
所以我的问题是...
什么是提取隐含信息,短目测每一个存储过程的最佳途径。我会考虑使用任何工具,编写我自己的SQL来查询系统表,或者使用SQL-DMO模型 - 或者实际上让太阳下的任何东西都让计算机做更多的工作,而我做的更少。
答
如果关系只能通过SP中的连接来识别,那么您就不会有很多运气将它自动化。
可能有必要使用探查器捕获查询以首先查找最常见的联接。
答
当谈到重构,我是老派:
- 文档你有什么,使用可视化工具。
- 描述 - 以书面形式 - 此数据库捕获的业务模型。
- 剔除描述名词中的实体和您拥有的现有模式。
- 创建一个新的ER模型;咨询业务。
- 基于ER创建新的数据库
- 将ETL数据转移到新的数据库和测试。
答
您可以使用sys.sql_dependencies
找出一个SP取决于哪些列和表(如果你不这样做你的SP SELECT *
帮助)。这将帮助你至少获得候选人的清单:
referenced_major_id == the OBJECT_ID of the table
referenced_minor_id == the column id: COLUMNPROPERTY(referenced_major_id,
COLUMN_NAME,
'ColumnId')
您可能需要使用以确保依赖性是最新的,要工作。即,如果您更改视图,则需要在每个非模式绑定模块上使用(显然,模式绑定模块不允许在第一个位置进行任何基础更改更改 - 但如果您致电,则会出现错误模式绑定对象),它依赖于该视图。您可以通过致电对这些对象实现自动化:
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