目前,我们几乎没有参照完整性,并且有许多表自我加入(实际上可能更好地表示为单独的表或加入的视图)。
这些表如何相互关联的知识隐含在存储过程的逻辑中,而不是模式中的显式。我们正在考虑改变这一点。
第一步是真正了解隐含关系并记录它们。
所以我的问题是......
提取隐含信息的最佳方法是什么,缺少对每个存储过程的关注。我将考虑使用任何工具,编写自己的SQL来查询系统表,或者使用SQL-DMO模型 - 或者实际上在阳光下的任何东西都可以让计算机做更多的工作而我做的更少。
答案 0 :(得分:1)
如果这些关系只能通过SP中的联接来识别,那么你就不会有很多运气自动化。
使用探查器捕获查询以查找最常见的连接可能是值得的。
答案 1 :(得分:0)
在重构方面,我是老派:
答案 2 :(得分:0)
您可以使用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')
您可能必须使用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