查找所有使用链接服务器的视图

Posted

技术标签:

【中文标题】查找所有使用链接服务器的视图【英文标题】:Finding all views that are using linked server 【发布时间】:2012-08-02 02:01:58 【问题描述】:

我正在更新链接服务器的网址。在进行更改之前,我想知道所有引用此链接服务器的视图。是否有任何编程方式 (TSQL) 来执行此任务?

感谢您的帮助。

我使用的是 SQL Server 2005、2008 和 2012。引用链接服务器的数据库服务器大多是 SQL Server 2005

【问题讨论】:

View linked server dependencies sql server 2008的可能重复 你会接受答案 3 吗? 【参考方案1】:

虽然它可能会返回误报,并且不会捕获使用动态 SQL 构造四部分名称的任何情况,但这可能是最简单的方法:

SELECT name FROM sys.views
WHERE LOWER(OBJECT_DEFINITION([object_id])) LIKE LOWER('%LinkedServerName%');

【讨论】:

@t-clausen.dk 你能解释一下吗? 我在我们的一个数据库中尝试过,4 个带有链接服务器的视图中有 4 个没有找到 @t-clausen.dk 你把LinkedServerName改成你的链接服务器的实际名称了吗??? 我希望 OP 有多个链接服务器,“此链接服务器”和“链接服务器的 URL”。我把它读成复数形式。添加更多链接服务器时,硬编码并不是很方便。 @t-clausen.dk:在说“不”之前检查区分大小写的排序规则。或 COLLATE 全部小写。我知道这行得通:***.com/questions/6451566/…【参考方案2】:

这将找到视图:

SELECT t2.name, OBJECT_DEFINITION(t1.[object_id]) view_definition  
FROM sys.views t1 join sys.servers t2 on 
OBJECT_DEFINITION(t1.[object_id]) like '%['+ t2.name + '].%' ESCAPE '['

如果表、视图、模式或数据库与链接服务器同名,则可能会失败。

如果某些视图没有通过第一次检查,您可以添加此行,这部分不会检查链接服务器名称周围的方括号。但请注意,这部分更有可能包括 额外不需要的视图

or OBJECT_DEFINITION(t1.[object_id]) like '% '+ t2.name + '.%'

编辑:将 sys.sysservers 更改为 sys.servers。谢谢亚伦伯特兰

【讨论】:

为什么选择 sys.sysservers 而不是 sys.servers?如果您正在寻找特定的 24 个链接服务器,但您定义了 100 个链接服务器,该怎么办?此外,您的第二个子句中的前导空格将错过前面有制表符或回车/换行符的引用。 我使用 sys.sysservers 是因为我没有意识到这是旧方式,感谢您指出这一点。 QA 指定:查找链接服务器的视图,这就是我试图做的。我从未在链接服务器、数据库、模式或列之间看到或制作过换行符、空格或制表符。但是现在你提到它我意识到这是可能的,我确实没有预料到会发生这种情况。当我使用你的版本时,当只有 11 个链接服务器时,我返回了 43 行。所以我猜这两种解决方案都有缺陷。 我认为没有完美的解决方案。这就是为什么我在我的解决方案前面加上关于误报、动态 SQL 等的说明,以及为什么我对你含糊的“这不会抓住它”的评论感到失望。 您需要将 srvname 更改为 [name] - sys.servers 上不存在 srvname 对我来说,ESCAPE '[' 部分也不适合我。当我删除它时,它工作正常。因此,无论谁使用它,都取决于您是否使用方括号,请记住这一点。【参考方案3】:

如果您需要按名称查找数据库对象(例如表、列、触发器) - 请查看名为 SQL Search 的 FREE Red-Gate 工具,它会搜索您的整个任何类型字符串的数据库。

对于任何 DBA 或数据库开发人员来说,它都是必备工具 - 我是否已经提到它绝对免费可用于任何用途??

【讨论】:

【参考方案4】:

试试这个:

SELECT name, OBJECT_DEFINITION([object_id]) FROM sys.views
where OBJECT_DEFINITION([object_id]) like '%.%.dbo.%'

【讨论】:

或 OBJECT_DEFINITION([object_id]) like '%.%.[dbo].%' 这与我的回答不同(而且更好),因为您已经硬编码了 dbo 架构并返回 any 四部分名称(包括您使用的其他链接服务器不找)?我现在很困惑。 @AaronBertrand 你是完全正确的,这可能会失败。如果视图定义如下:'select * from database.dbo.field join database.dbo.field on 1 = 1' 这将失败

以上是关于查找所有使用链接服务器的视图的主要内容,如果未能解决你的问题,请参考以下文章

查找哪个集合视图单元格链接到我的表格视图

在 Oracle PL/SQL 视图中管理 DB 链接

MS Access 链接到 SQL 服务器视图

使用 Django 和 a2 服务器将视图链接到网页

查找链接服务器上的列依赖项

MS Access:在设计指南视图中创建链接表不显示要链接的表?