共用方式為


執行分散式查詢的 SQL Agent 作業可能會失敗,並出現 65535、782 或 7437 錯誤訊息

本文可協助您解決執行分散式查詢的 SQL Agent 作業因 65535、782 或 7437 錯誤訊息而失敗的問題。

原始產品版本:SQL Server
原始 KB 編號: 2492477

徵兆

當作業擁有者不是系統管理員伺服器角色的成員時,執行分散式(鏈接伺服器)查詢的 SQL Agent 作業可能會失敗,並出現類似下列其中一個錯誤訊息:

  • 鏈接伺服器 「連結伺服器名稱」的 OLE DB 提供者「<<提供者名稱>>」傳回訊息「登入逾時已過期」。
    鏈接伺服器 「“<Linkedserver Name」 的 OLE DB 提供者「<提供者名稱>>」傳回訊息「建立伺服器連線時發生錯誤」。 連線到 SQL Server 2005 時,此失敗可能是因為預設設定下的 SQL Server 不允許遠端連線。」。
    訊息 65535、層級 16、狀態 1、行 0
    SQL 網路介面:尋找指定的伺服器/實例時發生錯誤 [xFFFFFFFF]。

  • 訊息 782,層級 16,狀態 1,行 0
    SSL 提供者:安全性套件中沒有可用的認證
    連結伺服器 「鏈接伺服器名稱」的 OLE DB 提供者「<<提供者名稱>>」傳回訊息「客戶端無法建立連線」。

例如,在 SQL Server 2008 環境中,錯誤訊息可能類似下列內容:

  • 鏈接伺服器 「<Linkedserver Name>」 的 OLE DB 提供者 「SQLNCLI」 傳回訊息 「登入逾時已過期」。
    鏈接伺服器 「“<Linkedserver Name>」 的 OLE DB 提供者 「SQLNCLI」 傳回訊息:「建立伺服器連線時發生錯誤。 連線到 SQL Server 2005 時,此失敗可能是因為預設設定下的 SQL Server 不允許遠端連線。」。
    訊息 65535、層級 16、狀態 1、行 0
    SQL 網路介面:尋找指定的伺服器/實例時發生錯誤 [xFFFFFFFF]。

  • 訊息 782,層級 16,狀態 1,行 0
    SSL 提供者:鏈接伺服器 「鏈接伺服器名稱>」傳回訊息「用戶端無法建立連線」的安全性套件 OLE DB 提供者「<SQLNCLI10」中沒有認證。

  • 訊息 7437,層級 16,狀態 1,第 3 行
    鏈接的伺服器無法在模擬下使用,而不需要模擬登入的對應。

使用 或 透過 Execute as Login T-SQL 語句使用模擬執行分散式查詢時,您可能也會看到相同的行為Openquery

原因

如果作業步驟的擁有者不是系統管理員固定伺服器角色的成員,Transact-SQL 作業步驟會以作業步驟的擁有者身分執行。 SQL Agent 會使用 Execute as Login ,在作業步驟擁有者的內容下執行作業步驟。 您無法跨伺服器界限使用 EXECUTE AS 語句。 這是依照設計的行為。 如需詳細資訊,請參閱《SQL Server 在線叢書》中的下列主題:

注意

相同的原因適用於您手動嘗試使用 EXECUTE AS 語句在Management Studio中變更分散式查詢的執行內容的情況。

因應措施

重要

下列因應措施會要求您使用連結伺服器物件的 [屬性] 底下的 [安全性] 頁面,定義對遠端伺服器登入對應的明確本地伺服器登入。 因為遠端使用者數據行必須是遠端伺服器上的 SQL Server 驗證登入,因此遠端伺服器的驗證模式應該已經設定為混合模式,或者應該在使用因應措施之前變更為混合模式。

如果 T-SQL 作業步驟是由不屬於系統管理員伺服器角色的使用者所擁有,而且如果步驟包含分散式查詢,請執行下列步驟以確保作業或查詢不會失敗:

  1. 針對本地伺服器上的每個作業步驟擁有者建立對應至遠端伺服器上的現有或新的登入。
  2. 請確定登入具有足夠的許可權,可以在分散式查詢中存取的遠端伺服器上執行各種模組。 如需詳細資訊,請參閱鏈接的伺服器屬性(安全性頁面)。

其他相關資訊

有時候您可能會注意到在徵兆一節中討論的查詢可能會成功執行。 這通常發生在模擬使用者先前登入遠端系統,而且系統仍然保持開啟遠端使用者所建立的連線時。 您不應該預期查詢會一直運作。

重現行為的步驟

  1. 在您的 SQL 實例上,使用 SQL Server Management Studio (SSMS) 或下列腳本,建立另一個 SQL 實例的連結伺服器。

    EXEC master.dbo.sp_addlinkedserver @server = <server name>, @srvproduct=N'SQL Server'
    /* For security reasons the linked server remote logins password is changed with ######## */
    EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=<servername> ,
    @useself=N'True',@locallogin=NULL,@rmtuser=NULL,@rmtpassword=NULL
    
  2. 使用系統管理員伺服器角色成員的登入,在 SSMS 中執行下列查詢,並確保其運作正常。

    SELECT * FROM <servername>.master.sys.sysobjects
    
  3. 現在,將查詢的內容變更為非系統管理員帳戶,並執行相同的查詢。

    EXECUTE AS login='Domain\Login1'
    GO
    SELECT suser_sname()
    GO
    SELECT * FROM <servername>.master.sys.sysobjects
    GO
    

此步驟失敗,並出現徵兆一節中所述的錯誤。

注意

OPENROWSETOPENDATASOURCE 函式不會受到此問題的影響,因為這些函式包含認證做為參數。
BEGIN DISTRIBUTED TRANSACTION 是個別的語句,不會取得自己的認證,而且不會受到此問題的影響。 不過,如果未正確設定連結的伺服器安全性,這些語句仍會失敗。