【问题标题】:View linked server dependencies sql server 2008查看链接服务器依赖项 sql server 2008
【发布时间】:2011-06-23 08:55:11
【问题描述】:

有没有人知道如何/是否可以查看依赖于 Sql Server 2008 中链接服务器的所有表/视图/存储过程。基本上就好像链接服务器可以访问上下文菜单“查看依赖项”?

非常感谢任何帮助。

谢谢

【问题讨论】:

    标签: sql-server dependencies linked-server


    【解决方案1】:

    搜索一下

    SELECT OBJECT_NAME(object_id), *
    FROM sys.sql_modules
    WHERE definition LIKE '%myLinkedServer%'
    

    或者使用 免费 Red gate SQL Search 来使用 GUI 做同样的事情

    没有跟踪服务器级链接服务器对象和数据库级对象之间依赖关系的表或功能

    注意:INFORMATION_SCHEMA 视图和旧系统会截断定义,因此对于定义搜索不可靠。

    【讨论】:

    • 您必须对服务器上的每个数据库运行该搜索...也许使用 sp_msforeachdb
    • 这将起作用,除非您有一个存储在使用链接服务器的 SQL Server 之外的查询(例如,在报表中)。在这种情况下,您将不得不求助于跟踪或扩展事件。
    【解决方案2】:

    按照@Mitch Wheat 的建议,这里有一些 sql 可以为服务器上的所有数据库运行@gbn 的答案。也许这对某人来说会有点时间。

    USE Master;
    GO
    
    IF OBJECT_ID('tempdb..#Deps') IS NOT NULL
      BEGIN
        DROP TABLE #Deps
      END
    
    CREATE TABLE #Deps
      (
        [ServerName] [VARCHAR](500) NOT NULL,
        [DatabaseName] [VARCHAR](500) NOT NULL,
        [SchemaName] [VARCHAR](500) NOT NULL,
        [ObjectName] [VARCHAR](MAX) NULL,
        [ObjectId] [INT] NOT NULL,
        [ObjectType] [VARCHAR](500) NOT NULL,
        [DependsOnLinkedServer] [VARCHAR](500) NOT NULL,    
        [definition] [VARCHAR](MAX) NULL
      )
    
    IF OBJECT_ID('tempdb..#Queries') IS NOT NULL
      BEGIN
        DROP TABLE #Queries
      END
    
    SELECT
      REPLACE('INSERT INTO #Deps 
         (
           [ServerName]       
           ,[DatabaseName]
           ,[SchemaName]
           ,[ObjectName]
           ,[ObjectType]
           ,[ObjectId]
           ,[DependsOnLinkedServer]
           ,[definition]
         )
         SELECT
           @@SERVERNAME,
           ''?'' AS DatabaseName,
           s.name AS SchemaName,
           o.name AS ObjectName,
           o.type_desc AS ObjectType,
           m.object_id AS ObjectId,
           ''' + srv.name + ''' AS DependsOnLinkedServer,
           m.definition
         FROM
           [?].sys.sql_modules m
           LEFT OUTER JOIN [?].sys.objects o
           ON m.object_id = o.object_id
           LEFT OUTER JOIN [?].sys.schemas s
           ON o.schema_id = s.schema_id
         WHERE     
           definition LIKE ''%' + srv.name + '%''', CHAR(13) + CHAR(10), '') AS Query
    INTO
      #Queries
    FROM
      sys.servers srv;
    GO
    
    DECLARE @Query AS VARCHAR(MAX)
    DECLARE LinkedServerCursor CURSOR FAST_FORWARD
    FOR
      SELECT
        Query
      FROM
        #Queries
    
    OPEN LinkedServerCursor
    FETCH NEXT FROM LinkedServerCursor INTO @Query;
    
    WHILE @@FETCH_STATUS = 0
      BEGIN  
        EXECUTE master.sys.sp_MSforeachdb @Query
    
        FETCH NEXT FROM LinkedServerCursor INTO @Query;
      END
    
    CLOSE LinkedServerCursor;
    DEALLOCATE LinkedServerCursor; 
    
    GO
    
    SELECT
      ServerName,
      DatabaseName,
      ObjectName,
      '[' + ServerName + '].[' + DatabaseName + '].[' + SchemaName + '].[' + ObjectName + ']' AS QualifiedObjectName,
      DependsOnLinkedServer,
      ObjectType  
    FROM
      #Deps
    ORDER BY
      ServerName,
      DatabaseName,
      ObjectName
    

    【讨论】:

    • +1 感谢您,为您提供了跟踪所有数据库中链接服务器的使用情况所需的所有信息。
    【解决方案3】:

    我建议将查询的中间部分更改为如下所示,以确保只有在查询中使用它时才能获得成功。 否则,每当提及服务器名称时,您都会得到很多误报。

    WHERE     
    definition LIKE ''%\[' + srv.name + '\].%''
    or definition LIKE ''%' + srv.name + '.%''', CHAR(13) + CHAR(10), '') AS Query
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-08
      • 1970-01-01
      • 2012-10-21
      • 2019-03-22
      • 2011-01-13
      • 1970-01-01
      相关资源
      最近更新 更多