SQL Server 2017创建DACPAC遇外部引用错误,求查询全量清单语句
没问题!我帮你整理了几个适用于SQL Server 2017的查询语句,能帮你完整获取数据库中所有外部引用的清单,包括它们所属的存储过程、视图等对象,方便你逐个排查DACPAC创建时的报错问题。
查询跨数据库的外部引用清单
这个查询会找出当前数据库中所有引用了其他数据库对象的存储过程、视图、函数、触发器等,清晰展示引用关系:
SELECT obj.name AS [引用对象名称], obj.type_desc AS [引用对象类型], referenced_database_name AS [外部数据库名称], referenced_schema_name AS [外部架构名称], referenced_entity_name AS [外部对象名称] FROM sys.sql_expression_dependencies dep INNER JOIN sys.objects obj ON dep.referencing_id = obj.object_id WHERE referenced_database_name IS NOT NULL AND obj.type IN ('P', 'V', 'FN', 'IF', 'TF', 'TR') -- 筛选存储过程、视图、各类函数、触发器 ORDER BY obj.type_desc, obj.name;
说明
这里用到了sys.sql_expression_dependencies系统视图,它记录了SQL对象之间的直接依赖关系。通过筛选referenced_database_name不为空,就能精准定位跨数据库的引用。其中obj.type的代码对应不同对象类型:P=存储过程,V=视图,FN=标量函数,IF=内联表值函数,TF=表值函数,TR=触发器。
查询跨服务器(链接服务器)的外部引用清单
如果你的数据库用到了链接服务器访问外部服务器的数据库,这个查询可以帮你找出这类引用:
SELECT obj.name AS [引用对象名称], obj.type_desc AS [引用对象类型], referenced_server_name AS [外部服务器名称], referenced_database_name AS [外部数据库名称], referenced_schema_name AS [外部架构名称], referenced_entity_name AS [外部对象名称] FROM sys.sql_expression_dependencies dep INNER JOIN sys.objects obj ON dep.referencing_id = obj.object_id WHERE referenced_server_name IS NOT NULL AND obj.type IN ('P', 'V', 'FN', 'IF', 'TF', 'TR') ORDER BY obj.type_desc, obj.name;
查询动态SQL中的外部引用(补充)
系统视图可能无法捕获动态SQL里的外部引用,这个查询会扫描对象的定义文本,找出疑似跨数据库/服务器的引用片段:
SELECT obj.name AS [引用对象名称], obj.type_desc AS [引用对象类型], SUBSTRING(definition, CHARINDEX('[', definition), CHARINDEX('].', definition) - CHARINDEX('[', definition) + 2) AS [疑似外部引用片段] FROM sys.sql_modules mod INNER JOIN sys.objects obj ON mod.object_id = obj.object_id WHERE (definition LIKE '%[%].[%]' -- 匹配 [数据库名].[架构名].[对象名] 或 [数据库名].[对象名] OR definition LIKE '%.[%].[%]') -- 匹配 数据库名.架构名.对象名 或 数据库名.对象名 AND obj.type IN ('P', 'V', 'FN', 'IF', 'TF', 'TR') ORDER BY obj.type_desc, obj.name;
额外补充检查:同义词指向的外部对象
如果数据库中有指向外部对象的同义词,也可能导致DACPAC报错,用下面的查询检查:
SELECT syn.name AS [同义词名称], syn.base_object_name AS [指向的外部对象] FROM sys.synonyms syn WHERE syn.base_object_name LIKE '%.%' -- 匹配跨数据库/服务器的对象路径 ORDER BY syn.name;
注意事项
- 执行这些查询需要你拥有
VIEW DEFINITION权限以及系统视图的访问权限; - 动态SQL的查询可能存在少量误报(比如字符串中恰好包含类似格式的文本),需要你手动核对;
内容的提问来源于stack exchange,提问作者Britt Wescott
相关产品推荐
相关产品推荐

