如何编写函数:传入视图名返回其依赖的外部数据库名称?
获取跨库视图依赖的数据库名称
嘿,这个需求我之前也碰到过,跨库视图的依赖追踪确实挺实用的。针对SQL Server环境,咱们可以利用系统自带的视图来实现这个函数,下面给你两种方案,按需选择:
方案一:标量函数(返回单个依赖数据库)
如果你的视图只会依赖一个外部数据库,用这个标量函数最方便,传入视图名称就能直接拿到对应的数据库名:
CREATE FUNCTION dbo.GetViewDependentDB(@ViewName NVARCHAR(128)) RETURNS NVARCHAR(128) AS BEGIN DECLARE @DependentDB NVARCHAR(128) -- 关联系统视图,找到视图的跨库依赖 SELECT TOP 1 @DependentDB = sed.referenced_database_name FROM sys.objects o INNER JOIN sys.sql_expression_dependencies sed ON o.object_id = sed.referencing_id WHERE o.name = @ViewName AND o.type = 'V' -- 限定对象类型为视图 AND sed.referenced_database_name IS NOT NULL -- 只筛选跨库依赖 RETURN @DependentDB END
使用示例
-- 传入你的视图名称,比如例子中的'bla' SELECT dbo.GetViewDependentDB('bla') AS DependentDatabase;
方案二:表值函数(返回所有依赖数据库)
如果一个视图可能依赖多个外部数据库,表值函数可以返回所有符合条件的数据库名称:
CREATE FUNCTION dbo.GetViewDependentDBs(@ViewName NVARCHAR(128)) RETURNS TABLE AS RETURN ( SELECT DISTINCT sed.referenced_database_name AS DependentDatabase FROM sys.objects o INNER JOIN sys.sql_expression_dependencies sed ON o.object_id = sed.referencing_id WHERE o.name = @ViewName AND o.type = 'V' AND sed.referenced_database_name IS NOT NULL )
使用示例
SELECT * FROM dbo.GetViewDependentDBs('bla');
注意事项
- 权限要求:执行函数的用户需要拥有
VIEW DEFINITION权限,或者属于db_owner角色,才能访问系统视图sys.objects和sys.sql_expression_dependencies。 - 加密视图限制:如果视图是用
WITH ENCRYPTION创建的,系统不会记录它的依赖关系,这个方法就失效了。 - 跨服务器支持:如果视图依赖的是其他服务器上的数据库(比如
ServerName.ZutatenDB.dbo.Bla),referenced_server_name字段会记录服务器名,referenced_database_name依然能正确返回数据库名称,你可以根据需求扩展函数返回服务器信息。
内容的提问来源于stack exchange,提问作者ozz
相关产品推荐
相关产品推荐

