Tsql 识别所有实体的所有依赖项

Tsql 识别所有实体的所有依赖项,tsql,sql-server-2005,Tsql,Sql Server 2005,我们正在升级ERP系统,需要一种方法来识别模式更改可能破坏的过程、视图和功能。我们将所有接口逻辑和支持实体托管在与生产数据库相同的实例中的补充数据库中。我需要一个脚本,该脚本将收集新生产数据库中的所有表及其字段、数据类型和大小,并将这些结果与补充数据库中的所有过程、视图和函数进行比较,然后返回现在已断开的依赖项。有办法做到这一点吗?在2005年,这将是非常困难的,因为直到SQL Server 2008才添加更好的依赖项功能 我想您可以通过两次重新编译所有视图、过程、函数和触发器来确保sysdep

我们正在升级ERP系统,需要一种方法来识别模式更改可能破坏的过程、视图和功能。我们将所有接口逻辑和支持实体托管在与生产数据库相同的实例中的补充数据库中。我需要一个脚本,该脚本将收集新生产数据库中的所有表及其字段、数据类型和大小,并将这些结果与补充数据库中的所有过程、视图和函数进行比较,然后返回现在已断开的依赖项。有办法做到这一点吗?

在2005年,这将是非常困难的,因为直到SQL Server 2008才添加更好的依赖项功能

我想您可以通过两次重新编译所有视图、过程、函数和触发器来确保sysdepends是最新的(因为在第一次编译时,仍然可能会出现延迟的名称解析问题等):

现在,您可以对
sysdependens
/
sys.sql_dependencies
有一点信心,但是为它们生成
ALTER
命令可能会更好,这样它们会被主动重新编译,而不是仅仅标记为重新编译。这假设在
CREATE
命令本身包含文本
CREATE
之前,您对注释没有兴趣。(?或有能力?)

完成此操作后,您可以查看
sys.sql\u依赖项
(在网格中显示的结果最好):

连接到
sys.SCHEMA
始终是必要的,因为虽然可以使用
OBJECT\u SCHEMA\u NAME()
,但这在RTM中是不可用的,我不知道您使用的是什么构建。如果您可以访问该函数,那么可以简化其中的一些连接

另一个想法


你可以看看第三方工具,比如。我只是从外围角度看了一下,这是很久以前的事了,所以我不能担保,只是该公司生产的工具可以正常工作。

进一步思考,看起来您正在寻找的大部分功能都可以在中使用-它将向您展示两个数据库具有共同点的所有对象之间的所有差异。而且,这很有效。两个后续问题:1.)补充数据库对生产数据库中的表/字段有依赖关系,我如何扩展它以获取这些依赖关系?2.)我如何将其扩展到包括实体所依赖的列?@Ron SQL Server不知道跨数据库依赖关系,因此最好是将两个数据库中的sys.columns连接起来,并在名称上进行匹配(假设依赖关系可以通过名称反映)。否则,您将比SQL Server更了解依赖关系。至于这些列,您应该能够从dependencies视图中的minor_id派生它们,但是我正在打电话,所以现在无法验证。
DECLARE @sql NVARCHAR(MAX); SET @sql = N'';

SELECT @sql = @sql + N'
EXEC sp_refreshview N''' + s.name + '.' + v.name + ''';'
  FROM sys.views AS v
  INNER JOIN sys.schemas AS s
  ON v.[schema_id] = s.[schema_id];

SELECT @sql = @sql + N'
EXEC sp_recompile N''' + s.name + '.' 
    + OBJECT_NAME(m.[object_id]) + ''';'
  FROM sys.sql_modules AS m
  INNER JOIN sys.objects AS o
  ON m.[object_id] = o.[object_id]
  INNER JOIN sys.schemas AS s
  ON o.[schema_id] = s.[schema_id]
  AND o.[type] IN (N'TR', N'FN', N'IF', N'P', N'TF');

PRINT @sql;
--EXEC sp_executesql @sql;
DECLARE @sql NVARCHAR(MAX); SET @sql = N'';

SELECT @sql = @sql + N'
GO
' + STUFF(definition, CHARINDEX('CREATE', UPPER(definition)), 6, 'ALTER')
  FROM sys.sql_modules AS m
  INNER JOIN sys.objects AS o
  ON m.[object_id] = o.[object_id]
  INNER JOIN sys.schemas AS s
  ON o.[schema_id] = s.[schema_id]
  AND o.[type] IN (N'TR', N'FN', N'IF', N'P', N'TF');

PRINT @sql;
-- EXEC sp_executesql @sql;
SELECT 
   s1.name + '.' + OBJECT_NAME(d.[object_id]),
  ' (' + o1.type_desc + ')',
  ' depends on => ',
  s2.name + '.' + OBJECT_NAME(d.referenced_major_id),
  ' (' + o2.type_desc + ')'
FROM sys.sql_dependencies AS d
INNER JOIN sys.objects AS o1
ON d.[object_id] = o1.[object_id]
INNER JOIN sys.schemas AS s1
ON o1.[schema_id] = s1.[schema_id]
INNER JOIN sys.objects AS o2
ON d.[referenced_major_id] = o2.[object_id]
INNER JOIN sys.schemas AS s2
ON o2.[schema_id] = s2.[schema_id];