如何查询快照数据库中视图的依赖关联对象?
快照数据库视图的引用对象定位方法
SQL Server自带的「View Dependencies」GUI功能仅支持追踪同数据库内的对象依赖关系,无法识别跨数据库(含只读快照数据库)的对象引用,可通过以下方案实现全量定位:
静态元数据扫描(覆盖所有硬编码引用,准确率最高)
跨快照的对象引用不会写入当前业务库的系统依赖表,直接遍历所有对象的定义文本匹配目标视图标识,即可定位绝大多数引用方。
- 第一步:连接数据库实例,在快照数据库上执行以下语句,导出库内所有用户视图的全限定名列表,避免后续匹配到同名表、存储过程产生误报:
-- 将[]中内容替换为实际的快照数据库名称 SELECT QUOTENAME(s.name) + '.' + QUOTENAME(v.name) AS view_full_name FROM [你的快照数据库名].sys.views v INNER JOIN [你的快照数据库名].sys.schemas s ON v.schema_id = s.schema_id WHERE v.is_ms_shipped = 0
- 第二步:切换到需要排查的业务数据库,执行以下语句扫描所有用户对象的定义,匹配上一步导出的视图名称:
-- @MatchKeywords 填入上一步查出的视图名,多个名称用|分隔 DECLARE @MatchKeywords NVARCHAR(MAX) = N'dbo.v_order_snap|dbo.v_user_snap'; DECLARE @SnapshotDBName SYSNAME = N'你的快照数据库名'; SELECT schema_name = s.name, object_name = o.name, object_type = o.type_desc FROM sys.sql_modules m INNER JOIN sys.objects o ON m.object_id = o.object_id INNER JOIN sys.schemas s ON o.schema_id = s.schema_id WHERE o.is_ms_shipped = 0 AND ( m.definition LIKE '%' + QUOTENAME(@SnapshotDBName) + '.%' OR PATINDEX('%' + REPLACE(@MatchKeywords, '|', '%|%') + '%', m.definition) > 0 )
如果需要覆盖SQL Agent作业、SSIS集成包这类库外对象的引用,可以在msdb、SSISDB系统库上执行相同的扫描逻辑,排查作业步骤、包配置中的引用内容。
运行态语句捕获(覆盖动态SQL拼接场景)
静态扫描无法识别通过动态SQL拼接生成的引用(例如EXEC('SELECT * FROM 快照库.dbo.v_order_snap')这类写法),这类场景可以开启扩展事件(Extended Events)或SQL Trace,在业务正常运行的周期内捕获所有实际执行的请求,过滤包含快照库视图名的语句后溯源调用方即可。
注意事项
- 不要直接查询
sys.sql_expression_dependencies系统视图定位跨快照依赖:该视图默认不记录三段式命名的跨库依赖,且快照数据库为只读状态,不会反向同步依赖关系到其他关联库。 - 不需要在快照数据库本身执行依赖查询:快照仅提供只读数据访问,不存在存储在快照内的对象引用其内部视图,所有引用方都存在于其他可读写的业务库、调度作业、外部应用配置中。
内容的提问来源于stack exchange,提问作者Dana
相关产品推荐
相关产品推荐

