查找所有使用链接服务器的视图
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' 这将失败以上是关于查找所有使用链接服务器的视图的主要内容,如果未能解决你的问题,请参考以下文章