SQL Server关系隐藏在存储过程而不是模式中

时间:2009-12-03 11:42:12

标签: sql-server stored-procedures referential-integrity

目前,我们几乎没有参照完整性,并且有许多表自我加入(实际上可能更好地表示为单独的表或加入的视图)。

这些表如何相互关联的知识隐含在存储过程的逻辑中,而不是模式中的显式。我们正在考虑改变这一点。

第一步是真正了解隐含关系并记录它们。

所以我的问题是......

提取隐含信息的最佳方法是什么,缺少对每个存储过程的关注。我将考虑使用任何工具,编写自己的SQL来查询系统表,或者使用SQL-DMO模型 - 或者实际上在阳光下的任何东西都可以让计算机做更多的工作而我做的更少。

3 个答案:

答案 0 :(得分:1)

如果这些关系只能通过SP中的联接来识别,那么你就不会有很多运气自动化。

使用探查器捕获查询以查找最常见的连接可能是值得的。

答案 1 :(得分:0)

在重构方面,我是老派:

  1. 记录您拥有的内容,使用可视化工具。
  2. 以书面形式描述此数据库捕获的业务模型。
  3. 从描述名词和您拥有的现有架构中挑选出实体。
  4. 创建新的ER模型;在此期间咨询业务。
  5. 根据ER
  6. 创建新数据库
  7. ETL数据到新数据库和测试。

答案 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