簡體   English   中英

在存儲過程中創建和銷毀鏈接服務器

[英]Create and Destroy Linked Server in Stored Procedure

我有一個存儲過程,需要觸摸兩個不同服務器上的一些數據。 其中一台服務器包含一些敏感信息,我們寧願不要一直將此服務器鏈接到另一台服務器。

為了解決這個問題,我編寫了將服務器直接鏈接並銷毀到存儲過程中的調用,如下所示:

IF NOT EXISTS (
        SELECT NAME
        FROM sys.servers
        WHERE NAME = 'TIMECLOCK'
        )
    EXEC sys.sp_addlinkedserver @server = 'TIMECLOCK'
        ,@srvproduct = 'SQL Server';

/* a select statement */
EXEC sys.sp_dropserver [TIMECLOCK]

然而,有時(但不是所有的時間!),當我運行它,它拋出一個錯誤告訴我,它無法找到該TIMECLOCK在服務器sys.servers 不一致使我感到困惑,因為我已經嘗試了許多場景(在運行過程之前有和沒有實例化鏈接的情況下),它們都大約有70%的時間有效。

知道是什么原因造成的嗎?

其中一台服務器包含一些敏感信息,我們寧願不要一直將此服務器鏈接到另一台服務器。

垃圾。 如果您確實關心安全性,則應立即加強安全性並加以處理,而不是為一個假想的問題選擇最壞的解決方案。

話雖如此,鏈接服務器還是有其他專門為此目的設計的替代方法-當您必須查詢外部數據但又不想創建持久鏈接時。 這是opendatasourceopenrowset 您可以選擇最喜歡的任何一個。

我同意上述羅傑·沃爾夫的觀點。

但是,如果必須這樣做,則可以將代碼括在while循環中。 它效率不高,但是可以保證如果添加鏈接服務器失敗,它將繼續嘗試訪問它。

因此,如果不是NOT EXISTS(),請執行WHILE NOT EXISTS()。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM