SSMS查询SQL Azure数据库对象依赖为何不可靠?如何提升可靠性?
SQL Azure表依赖查询遗漏对象的原因与解决方法
为什么SSMS的依赖列表会漏对象?
- SSMS的「查看依赖」功能依赖SQL Server的系统视图
sys.dm_sql_referencing_entities和sys.sql_expression_dependencies,但这两个视图只追踪显式、已成功解析的依赖关系。如果视图是用动态SQL创建的,或者引用表时没指定schema(比如直接写table而不是dbo.table),又或者表结构变更后视图没重新编译,这些情况都会导致依赖没被系统正确记录,自然不会出现在SSMS的列表里。 - 要是涉及跨数据库的隐式引用(比如弹性数据库查询场景),SSMS的依赖工具也识别不了这类跨库依赖。
提升依赖查询可靠性的实用方法
直接查系统视图,比UI更靠谱
用下面的SQL直接查询所有引用目标表的对象,结果比SSMS右键的列表更完整:SELECT referencing_schema_name, referencing_entity_name, referencing_class_desc, is_caller_dependent FROM sys.dm_sql_referencing_entities ('你的schema名.你的表名', 'OBJECT');再结合
sys.sql_expression_dependencies查看更详细的依赖细节:SELECT OBJECT_NAME(referencing_id) AS 引用对象名, referenced_entity_name AS 被引用表名, referenced_schema_name AS 被引用表schema, is_ambiguous AS 是否存在模糊引用 FROM sys.sql_expression_dependencies WHERE referenced_id = OBJECT_ID('你的schema名.你的表名');刷新所有依赖对象的元数据
表结构变更后,很多视图的依赖元数据没更新,手动刷新能让系统重新识别依赖:
单视图刷新:EXEC sp_refreshview N'你的schema名.你的视图名';批量刷新所有非架构绑定视图:
DECLARE @sql NVARCHAR(MAX) = ''; SELECT @sql += 'EXEC sp_refreshview N''' + SCHEMA_NAME(schema_id) + '.' + name + ''';' + CHAR(10) FROM sys.views WHERE OBJECTPROPERTY(object_id, 'IsSchemaBound') = 0; EXEC sp_executesql @sql;排查动态SQL里的隐藏依赖
系统视图追踪不了动态SQL里的表引用,得手动搜索对象定义:SELECT OBJECT_NAME(object_id) AS 对象名, definition AS 对象定义 FROM sys.sql_modules WHERE definition LIKE '%你的表名%';用架构绑定强关联依赖
创建视图时加上WITH SCHEMABINDING,这样后续修改表结构如果会影响视图,SQL Azure会直接报错阻止变更,同时依赖关系会被系统强绑定,绝不会遗漏。
内容的提问来源于stack exchange,提问作者Andrew Richards
相关产品推荐
相关产品推荐

