【问题标题】:SQL Server relationships buried in stored procedures rather than schemaSQL Server 关系隐藏在存储过程而不是架构中
【发布时间】:2009-12-03 23:31:29
【问题描述】:
目前,我们几乎没有参照完整性,并且有许多自连接的表(实际上可能更好地表示为连接的单独表或视图)。
这些表如何相互关联的知识隐含在存储过程的逻辑中,而不是明确的模式中。我们正在考虑改变这一点。
第一步是真正理解隐含的关系并记录它们。
所以我的问题是......
什么是提取隐含信息的最佳方法,而不是关注每个存储过程。我会考虑任何工具,编写我自己的 SQL 来查询系统表,或者使用 SQL-DMO 模型——或者实际上任何可以让计算机做更多工作而我做更少工作的工具。
【问题讨论】:
标签:
sql-server
stored-procedures
referential-integrity
【解决方案1】:
如果关系仅通过 SP 中的连接来识别,那么自动化它不会有很大的运气。
使用分析器捕获查询以首先找到最频繁的连接可能是值得的。
【解决方案2】:
说到重构,我是老派:
- 记录你拥有的东西,使用可视化工具。
- 以书面形式描述该数据库捕获的业务模型。
- 从描述名词和现有架构中挑选出实体。
- 创建一个新的 ER 模型;在此期间咨询业务。
- 基于 ER 创建新数据库
- ETL 数据转移到新数据库并进行测试。
【解决方案3】:
您可以使用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 (显然,模式绑定模块首先不允许任何底层更改更改 - 但如果您调用 @ 987654326@ 依赖于该视图的模式绑定对象。您可以通过在这些对象上调用 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