2011-06-23 147 views
6

是否有任何知道/如果有可能在Sql Server 2008中查看依賴於鏈接服務器的所有表/視圖/存儲過程。基本上就好像上下文菜單「View dependencies」是鏈接服務器可訪問嗎?查看鏈接的服務器依賴關係sql server 2008

任何幫助非常感謝。

感謝

回答

16

搜索它

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

或者使用免費Red gate SQL Search做同樣具有GUI

沒有表或功能的服務器 - 在曲目間的依賴關係高級鏈接服務器對象和數據庫級對象

注意:INFO RMATION_SCHEMA視圖和傳統syscomments會截斷定義,因此在定義搜索時不可靠。

+3

你就必須運行在服務器上的每個數據庫中搜索...也許使用sp_msforeachdb –

+0

謝謝,很好地工作,節省時間:) – Peuge

+0

很多這將工作,除非你有存儲之外的查詢SQL Server(例如在報表中)使用鏈接服務器。在這種情況下,你不得不求助於追蹤或擴展事件。 – PseudoToad

4

以下@Mitch小麥的建議,這裏有一些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 
+0

+1感謝您的支持,爲您提供了追蹤所有數據庫中鏈接服務器使用情況所需的全部信息。 – djskinner

0

我會建議改變查詢的中間部分如下,以確保只有當它在查詢中使用時,你會得到一個命中。 如果沒有,只要提到服務器名稱,就會得到很多誤報。

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