Sql-Server

連結伺服器的延遲名稱解析

  • August 26, 2016

我需要能夠創建指向連結伺服器的儲存過程,其中連結伺服器上尚不存在數據庫。

思考過程是上述儲存過程是更大的數據庫創建腳本的一部分。我的公司想在實時伺服器上執行這個數據庫創建腳本來創建新數據庫,確保一切正常,添加所有數據,然後將選擇(每日快照)數據遷移到報表伺服器(連結伺服器)。

我創建了將在數據庫創建腳本中指向名為 EDI_Report_Server 的連結伺服器的同義詞。例如:

IF NOT EXISTS (SELECT * FROM sys.synonyms WHERE object_id = 
              OBJECT_ID(N'[dbo].[EDI_SnapshotLog]') )
BEGIN
      SET @SynonymCreateSQL = N'CREATE SYNONYM [dbo].[EDI_SnapshotLog]
                              FOR [EDI_Report_Server].' + DB_NAME() +
                              '.[Snapshot].[SnapshotLog]'
      EXEC dbo.sp_executesql @SynonymCreateSQL
END

在這個數據庫創建腳本中,我將創建一個儲存過程,其程式碼類似於:

INSERT INTO EDI_SnapshotLog (
        [SnapshotLoadStartTime]
       ,[SnapshotLoadEndTime]
       ,[SnapshotLoadResult]
       ,[SnapshotValidationErrors]
       )
...
...

嘗試執行它會出現錯誤:

連結伺服器 “EDI_Report_Server” 的 OLE DB 提供程序 “SQLNCLI10” 不包含表 “”".“Snapshot”.“SnapshotLog”"。

我必須先在連結伺服器上創建數據庫和表,還是有辦法推遲連結伺服器上的名稱解析?

感謝您的時間

這很可能是不可能的。根據延遲名稱解析和編譯的 MSDN 頁面:

注意

延遲名稱解析只能在您引用不存在的表對象時使用。所有其他對像在創建儲存過程時必須存在。…

事實上,在連結伺服器上,延遲名稱解析似乎根本不起作用。我嘗試(在 SQL Server 2008 R2 RTM 和 2012 SP3 中)同時使用同義詞和對不存在表的直接連結伺服器引用,但都失敗了。因此,連結伺服器似乎根本不支持延遲名稱解析。

但是,您可以做的一件事是:

  1. 在遠端伺服器上創建一個“模板”數據庫(數據庫應該創建表和任何其他引用的對象)
  2. 創建所有同義詞以指向模板數據庫
  3. 創建儲存過程
  4. 創建“真實”數據庫後,刪除並重新創建同義詞

引用自:https://dba.stackexchange.com/questions/148047