徵狀
當作業的擁有者不是sysadmin伺服器角色的成員時,執行分散式(連結伺服器)查詢的 SQL 代理作業可能會失敗,並出現如下所示的其中一個錯誤訊息:
OLE DB 提供者「連結伺服器的 <提供者名稱>」 <Linkedserver 名稱> "傳回的訊息" 登入超時已過期 "。OLE DB 提供者「連結伺服器」的 <提供者名稱>」 <Linkedserver 名稱> "傳回的訊息" 在建立伺服器連線時發生錯誤。 連線至 SQL Server 2005 時,這可能是因為預設的 [SQL Server 不允許遠端連線] 這種情況。Msg 65535、Level 16、State 1、Line 0SQL Network 介面:尋找指定的伺服器/實例時發生錯誤 [xFFFFFFFF]。
或
Msg 782、Level 16、State 1、Line 0SSL 提供者: [連結伺服器] 的 [<提供者名稱>] 的 [安全性套件OLE DB 提供者]中沒有可用的認證<Linkedserver 名稱> "傳回的訊息" 用戶端無法建立連線]。
例如,在 SQL Server 2008 環境中,錯誤訊息可能會類似以下所示:
連結伺服器的 OLE DB 提供者 "SQLNCLI"> 的 [<Linkedserver 名稱] 傳回訊息 "登入超時已過期"。連結伺服器 "" 的 OLE DB 提供者 "SQLNCLI"> 「傳回的訊息」 <Linkedserver 名稱在建立伺服器連線時會發生錯誤。 連線至 SQL Server 2005 時,這可能是因為預設的 [SQL Server 不允許遠端連線] 這種情況。Msg 65535、Level 16、State 1、Line 0SQL Network 介面:尋找指定的伺服器/實例時發生錯誤 [xFFFFFFFF]。
或
Msg 782、Level 16、State 1、Line 0SSL 提供者:連結伺服器的安全性套件OLE DB 提供者 "SQLNCLI10" 沒有可用的認證 [<Linkedserver 名稱> "傳回的訊息" 用戶端無法建立連線]。
或
Msg 7437、Level 16、State 1、Line 3Linked server 無法在模擬中使用,而不會在類比登入的對應中使用。
您也可以在使用 Openquery,或透過「執行為登入」 T-sql 語句來執行分散式查詢時,看到相同的行為。
原因
如果作業步驟的擁有者不是sysadmin固定伺服器角色的成員,transact-sql 作業步驟就會以作業步驟的擁有者身分執行。 SQL 代理程式會使用「執行登入」在作業步驟擁有者的內容下執行作業步驟。 您無法在伺服器界限中使用 EXECUTE AS 語句。 產生此錯誤是系統刻意為之。 如需其他資訊,請參閱 SQL Server 書籍 Online 中的下列主題:
注意:在使用EXECUTE AS語句在 management studio 中手動變更分散式查詢執行內容的案例,同樣的原因也一樣。
因應措施
重要:下列因應措施需要您使用連結伺服器物件之 [屬性] 底下的 [安全性] 頁面,來定義 [明確的本機伺服器登入],以進行遠端伺服器登入。 因為遠端使用者資料行必須是遠端伺服器上的 SQL Server 驗證登入,所以遠端伺服器的驗證模式應該已設定為混合模式,或應該在使用以下所述的因應措施前改為混合模式。如果 T-sql 作業步驟是由sysadmin伺服器角色以外的使用者所擁有,而且如果步驟包含分散式查詢,請執行下列步驟以確保作業或查詢不會失敗:
-
針對本機伺服器上的每個作業步驟擁有者建立對應遠端伺服器上的現有或新登入。
-
確定登入具有足夠的許可權,可在遠端伺服器上執行分散式查詢所存取的各種模組。
如需其他資訊,請參閱 SQL Server 書籍 Online 中的下列主題:
其他相關資訊
有時候,您可能會發現在 [症狀] 區段的其中一個案例中討論的查詢可能會成功執行。 這通常是在模仿的使用者先前登入遠端系統,且系統仍保持開啟由遠端使用所建立的連線的情況下發生。 您不應該認為查詢會隨時起作用。再現行為的步驟
-
在您的 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
-
使用 Sysadmin 伺服器角色成員的登入,在 SSMS 中執行下列查詢,並確保其正常運作。
select * from <servername>.master.sys.sysobjects
-
現在,請將查詢的內容變更為非系統管理員帳戶,然後執行相同的查詢。
execute as login=’Domain\Login1’goselect suser_sname()goselect * from <servername>.master.sys.sysobjectsgo
此步驟失敗,並顯示本文 [症狀] 區段中所提及的錯誤。