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

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

感谢您的帮助。

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

【问题讨论】:

标签: sql-server tsql


【解决方案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 全部小写。我知道这行得通:stackoverflow.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 SearchFREE 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' 这将失败
    猜你喜欢
    • 1970-01-01
    • 2021-12-22
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多