嵌入在存储过程而不是模式中的SQL Server关系

问题描述:

目前我们只有很少的参照完整性,并且有许多自连接的表(实际上可能会更好地表示为单独的表或连接的视图) 。嵌入在存储过程而不是模式中的SQL Server关系

有关这些表彼此之间的相互关系的知识隐含在存储过程的逻辑中,而不是在模式中显式表示。我们正在考虑改变这一点。

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

所以我的问题是...

什么是提取隐含信息,短目测每一个存储过程的最佳途径。我会考虑使用任何工具,编写我自己的SQL来查询系统表,或者使用SQL-DMO模型 - 或者实际上让太阳下的任何东西都让计算机做更多的工作,而我做的更少。

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

可能有必要使用探查器捕获查询以首先查找最常见的联接。

当谈到重构,我是老派:

  1. 文档你有什么,使用可视化工具。
  2. 描述 - 以书面形式 - 此数据库捕获的业务模型。
  3. 剔除描述名词中的实体和您拥有的现有模式。
  4. 创建一个新的ER模型;咨询业务。
  5. 基于ER创建新的数据库
  6. 将ETL数据转移到新的数据库和测试。

您可以使用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') 

您可能需要使用​​以确保依赖性是最新的,要工作。即,如果您更改视图,则需要在每个非模式绑定模块上使用​​(显然,模式绑定模块不允许在第一个位置进行任何基础更改更改 - 但如果您致电​​,则会出现错误模式绑定对象),它依赖于该视图。您可以通过致电​​对这些对象实现自动化:

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