目前,我们几乎没有参照完整性,并且有许多自连接的表(实际上可能更好地表示为连接的单独表或视图)。
这些表如何相互关联的知识隐含在存储过程的逻辑中,而不是明确的模式中。我们正在考虑改变这一点。
第一步是真正理解隐含的关系并记录它们。
所以我的问题是...
什么是提取隐含信息的最佳方法,而不是关注每个存储过程。我会考虑任何工具,编写我自己的 SQL 来查询系统表,或者利用 SQL-DMO 模型——或者实际上任何让计算机做更多工作而我做更少工作的东西。
目前,我们几乎没有参照完整性,并且有许多自连接的表(实际上可能更好地表示为连接的单独表或视图)。
这些表如何相互关联的知识隐含在存储过程的逻辑中,而不是明确的模式中。我们正在考虑改变这一点。
第一步是真正理解隐含的关系并记录它们。
所以我的问题是...
什么是提取隐含信息的最佳方法,而不是关注每个存储过程。我会考虑任何工具,编写我自己的 SQL 来查询系统表,或者利用 SQL-DMO 模型——或者实际上任何让计算机做更多工作而我做更少工作的东西。
如果关系仅通过 SP 中的连接来识别,那么自动化它不会有很多运气。
使用分析器捕获查询以首先找到最频繁的连接可能是值得的。
您可以使用sys.sql_dependencies
来找出 SP 所依赖的列和表(如果您不在SELECT *
SP 中这样做会有所帮助)。这将帮助您至少获得候选人清单:
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
在重构方面,我是老派: