我们正在升级我们的 ERP 系统,需要一种方法来识别架构更改可能破坏的过程、视图和功能。我们将所有接口逻辑和支持实体托管在与生产数据库相同的实例中的补充数据库中。我需要一个脚本来收集新生产数据库中的所有表以及它们的字段、数据类型和大小,并将这些结果与补充数据库中的所有过程、视图和函数进行比较,并返回那些现在被破坏的依赖关系。有没有办法做到这一点?
1 回答
在 2005 年,这将是相当艰难的,因为sysdepends / sys.sql_dependencies 被彻底破坏,并且直到 SQL Server 2008 才添加了更好的依赖特性。
我想您可以通过重新编译所有视图、过程、函数和触发器两次来确保 sysdepends 是最新的(因为在第一次通过时可能仍然存在延迟名称解析问题等):
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;
sysdepends
现在您可以对/更有信心了sys.sql_dependencies
,但是为它们生成命令可能会更好,ALTER
这样它们就会被主动重新编译,而不是仅仅标记为重新编译。这假设您在CREATE <object>
自己包含 text 的命令之前没有对评论变得可爱create
。(生成ALTER
命令的方法不是很好吗?或者有能力CREATE OR REPLACE
?)
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;
完成后,您可以查看sys.sql_dependencies
(在网格结果中看起来最好):
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];
整个过程中的连接sys.schemas
都是必要的,因为虽然您可以使用OBJECT_SCHEMA_NAME()
,但 RTM 中不可用,而且我不知道您使用的是什么构建。如果您有权访问该功能,那么您可以简化其中一些连接。
另一个想法
您可以查看 3rd 方工具,例如Red-Gate 的 SQL Dependency Tracker。我只是从外围看了一下,那是很久以前的事了,所以我不能保证,只是该公司生产的工具可以正常工作。