2

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

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

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

所以我的问题是...

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

4

3 回答 3

1

如果关系仅通过 SP 中的连接来识别,那么自动化它不会有很多运气。

使用分析器捕获查询以首先找到最频繁的连接可能是值得的。

于 2009-12-03T11:53:01.973 回答
0

您可以使用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
于 2009-12-03T15:31:29.687 回答
0

在重构方面,我是老派:

  1. 记录你所拥有的,使用可视化工具。
  2. 以书面形式描述该数据库捕获的业务模型。
  3. 从描述名词和您拥有的现有模式中挑选出实体。
  4. 创建一个新的ER模型;在此期间咨询业务。
  5. 基于 ER 创建一个新的 DB
  6. ETL 数据转移到新的数据库并进行测试。
于 2009-12-03T15:21:37.910 回答