SQL Server版本 - 2008 R2获取SQL Server跨数据库依赖关系
我正在评估DMS解决方案,目标是接管维护。原始解决方案有一个中央数据库,其中包含与制造商有关的数据。它还为每个经销商提供一个数据库,这意味着存在大量的跨数据库依赖关系。
的问题:
- 没有DB文档
- 没有代码注释
- 大量堆
- 没有标准的对象命名约定
- 的DB中央有460+表和存储过程900+ ,除了其他 对象
- 每个经销商DB有370+表和2350+ SProcs,另外n至其他 对象
作为第一步,我建议的DB,为此,关键是要理解对象依赖性,包括跨数据库依赖关系的完整的清理。我尝试过使用Red Gate的解决方案,但输出方式太庞大。我所需要的是数据库中没有任何依赖关系的对象列表 - 它们既不依赖于其他对象,也不依赖于依赖它们的任何对象。
这里是我用来获取相关性列表的脚本:
SELECT
DB_NAME() referencing_database_name,
OBJECT_NAME (referencing_id) referencing_entity_name,
ISNULL(referenced_schema_name,'dbo') referenced_schema_name,
referenced_entity_name,
ao.type_desc referenced_entity_type,
ISNULL(referenced_database_name,DB_NAME()) referenced_database_name
FROM sys.sql_expression_dependencies sed
JOIN sys.all_objects ao
ON sed.referenced_entity_name = ao.name
我将创建一个表 - 依赖 - 到了我会被插入这个结果从每个DB设置。作为下一步,我还将创建另一个表 - AllObjects - 它将包含数据库中所有对象的列表。这里是脚本来做到这一点:
SELECT
DB_NAME() DBName,
name,
type_desc
FROM sys.all_objects
WHERE type_desc IN
(
'VIEW',
'SQL_TABLE_VALUED_FUNCTION',
'SQL_STORED_PROCEDURE',
'SQL_INLINE_TABLE_VALUED_FUNCTION',
'USER_TABLE',
'SQL_SCALAR_FUNCTION'
)
现在,从该表中,没有出现在依赖关系表中的列referenced_entity_name应该给我找的对象列表名称的列表。
SELECT
AO.DBName,
AO.name,
AO.type_desc
FROM AllObjects AO
LEFT OUTER JOIN Dependencies D ON
D.referenced_database_name = AO.DBName AND
D.referenced_entity_name = AO.name AND
D.referenced_entity_type = AO.type_desc
WHERE
D.referenced_database_name IS NULL AND
D.referenced_entity_name IS NULL AND
D.referenced_entity_type IS NULL
现在的问题:
- 一些对象依赖似乎在输出中丢失。我缺少什么 ?
- 我如何验证我的发现是正确的?
- 我的意思是有不同的方式来做到这一点,所以我可以比较 结果和双重检查?
由于提前,
拉吉
你也关心SYSTEM对象吗? –
但是type ='U'只会给用户表,对不对?我还需要考虑其他用户创建的对象。 – Raj
对不起,“and is_ms_shipped = 0”可能更适合第二个查询。这应该排除系统特定的对象。 –