sp_addlinkedsrvlogin (Transact-SQL)
適用於:SQL Server
建立或更新 SQL Server 本機實例上的登入與遠端伺服器上安全性帳戶之間的對應。
語法
sp_addlinkedsrvlogin
[ @rmtsrvname = ] N'rmtsrvname'
[ , [ @useself = ] 'useself' ]
[ , [ @locallogin = ] N'locallogin' ]
[ , [ @rmtuser = ] N'rmtuser' ]
[ , [ @rmtpassword = ] N'rmtpassword' ]
[ ; ]
引數
[ @rmtsrvname = ] N'rmtsrvname'
登入對應所套用的連結伺服器名稱。 @rmtsrvname為 sysname,沒有預設值。
[ @useself = ] 'useself'
藉由模擬本機登入或明確提交登入和密碼,判斷是否要連線到 rmtsrvname 。 @useself為 varchar(8),預設值為 true
。
- 的值
true
指定登入會使用自己的認證來連線到 @rmtsrvname,並 忽略@rmtuser 和 @rmtpassword 自變數。 false
指定@rmtuser與@rmtpassword自變數是用來連接到指定之@locallogin的@rmtsrvname。
如果 @rmtuser 和 @rmtpassword 設定為 NULL
,則不會使用登入或密碼連接到連結的伺服器。
[ @locallogin = ] N'locallogin'
本機伺服器上的登入。 @locallogin為 sysname 預設值為 NULL
。 NULL
指定這個專案會套用至連線至 @rmtsrvname的所有本機登入。 如果不是 NULL
, @locallogin 可以是 SQL Server 登入或 Windows 帳戶。 Windows 帳戶必須直接存取 SQL Server,或透過 Windows 群組中的成員資格。
[ @rmtuser = ] N'rmtuser'
當 為 false
時@useself,用來連線到@rmtsrvname的遠端登入。 @rmtuser為 sysname 預設值為 NULL
。 當遠端伺服器是不使用 Windows 驗證的 SQL Server 實例時, @rmtuser 是 SQL Server 登入。
[ @rmtpassword = ] N'rmtpassword'
與 @rmtuser相關聯的密碼。 @rmtpassword為 sysname,預設值為 NULL
。
傳回碼值
0
(成功) 或 1
(失敗)。
備註
當使用者登入本地伺服器並執行存取連結伺服器上數據表的分散式查詢時,本地伺服器必須代表使用者登入連結的伺服器,才能存取該數據表。 使用 sp_addlinkedsrvlogin
來指定本地伺服器用來登入連結伺服器的認證。
注意
若要在鏈接伺服器上使用數據表時建立最佳查詢計劃,查詢處理器必須具有連結伺服器的數據散發統計數據。 對數據表任何數據行具有有限許可權的使用者可能沒有足夠的許可權可取得所有有用的統計數據,而且可能會收到效率較低的查詢計劃和效能不佳。 如果鏈接的伺服器是 SQL Server 的實例,若要取得所有可用的統計數據,用戶必須擁有數據表或成為 sysadmin 固定伺服器角色的成員、db_owner固定資料庫角色,或鏈接伺服器上db_ddladmin固定資料庫角色的成員。 SQL Server 2012 SP1 (11.0.3x) 會修改取得統計數據的許可權限制,並允許具有 SELECT 許可權的使用者存取 DBCC SHOW_STATISTICS可用的統計數據。 如需詳細資訊,請參閱 DBCC SHOW_STATISTICS的許可權一節。
執行 會自動建立 sp_addlinkedserver
本地伺服器上所有登入與連結伺服器上的遠端登錄之間的預設對應。 默認對應表示 SQL Server 代表登入連接到連結伺服器時,會使用本機登入的用戶認證。 這相當於使用 設定true
為的連結伺服器來執行 sp_addlinkedsrvlogin
@useself ,而不需指定本機用戶名稱。 僅使用 sp_addlinkedsrvlogin
來變更默認對應,或新增特定本機登入的新對應。 若要刪除預設對應或任何其他對應,請使用 sp_droplinkedsrvlogin
。
SQL Server 不必使用 sp_addlinkedsrvlogin
來建立預先決定的登入對應,而是可以在下列所有條件都存在時,自動使用發出查詢的使用者 Windows 安全性認證(Windows 登入名稱和密碼)來聯機到鏈接伺服器:
使用者會使用 Windows 驗證模式連線到 SQL Server。
安全性帳戶委派可在用戶端和傳送伺服器上使用。
提供者支援 Windows 驗證模式;例如,在 Windows 上執行的 SQL Server。
注意
委派不需要針對單一躍點案例啟用,但多躍點案例需要委派。
使用 SQL Server 本機實例上所定義的 sp_addlinkedsrvlogin
對應來執行連結伺服器驗證之後,遠端資料庫中個別物件的許可權是由鏈接伺服器決定,而不是本地伺服器。
sp_addlinkedsrvlogin
無法從使用者定義的交易內執行。
權限
需要伺服器的 ALTER ANY LOGIN 權限。
範例
A. 使用自己的使用者認證,將所有本機登入連線到連結的伺服器
下列範例會建立對應,以確保本機伺服器的所有登入都會使用自己的使用者認證連線到連結的伺服器 Accounts
。
EXEC sp_addlinkedsrvlogin 'Accounts';
Or
EXEC sp_addlinkedsrvlogin 'Accounts', 'true';
注意
如果為個別登入建立明確的對應,則會優先於該鏈接伺服器可能存在的全域對應。
B. 使用不同的使用者認證將特定登入連線到連結的伺服器
下列範例會建立對應,以確保 Windows 使用者Domain\Mary
使用登入MaryP
和密碼 d89q3w4u
連線到連結的伺服器Accounts
。
EXEC sp_addlinkedsrvlogin 'Accounts', 'false', 'Domain\Mary', 'MaryP', 'd89q3w4u';
警告
此範例不會使用 Windows 驗證。 密碼將會以未加密的方式傳輸。 在儲存至磁碟、備份和記錄檔的數據源定義和腳本中,可能會顯示密碼。 請勿在這類連線中使用系統管理員密碼。 請洽詢您的網路管理員,以取得環境特定的安全性指引。
C. 將特定本機登入對應至遠端伺服器登入
在某些情況下,例如使用 Azure SQL 受控執行個體,若要透過連結伺服器在遠端伺服器上執行 Transact-SQL (T-SQL) 查詢的 SQL Agent 作業,您必須在本機伺服器上的登入與具有執行 T-SQL 查詢許可權的遠端伺服器上建立登入之間的對應。 當 SQL Agent 作業透過連結的伺服器連線到遠端伺服器時,它會在遠端登錄的內容中執行 T-SQL 查詢,該查詢必須具有執行 T-SQL 查詢的必要許可權。
如果您要在 Azure SQL 受控執行個體 對應 SQL Agent 作業的登入,您對應至遠端登錄的本機登入必須是 SQL Agent 作業的擁有者,除非 SQL Agent 作業是系統管理員,在此情況下,您應該對應所有本機登入。 如需詳細資訊,請檢閱使用 Azure SQL 受控執行個體 的 SQL Agent 作業。
在本機伺服器上執行下列範例命令,以在連接到連結的伺服器時,將本機登入local_login_name
對應至遠端伺服器remote_server
登入login_name
:
EXEC master.dbo.sp_addlinkedsrvlogin
@rmtsrvname = N'<remote_server>',
@useself = N'False',
@locallogin = N’<local_login_name>’,
@rmtuser = N'<login_name>',
@rmtpassword = '<login_password>'
D. 將所有本機登入對應至遠端伺服器登入
將 設定locallogin
為 NULL
,您可以將所有本機登入對應至遠端伺服器上的登入。
執行系統管理員所擁有的 Azure SQL 受控執行個體 sql Agent 作業,透過連結的伺服器查詢遠端伺服器時,需要將所有本機登入對應至遠端伺服器登入。 如需詳細資訊,請參閱使用 Azure SQL 受控執行個體 的 SQL Agent 作業。 當 SQL Agent 作業透過連結的伺服器連線到遠端伺服器時,它會在遠端登錄的內容中執行 T-SQL 查詢,該查詢必須具有執行 T-SQL 查詢的必要許可權。
在本機伺服器上執行下列範例命令,以在連線到連結的伺服器時,將所有本機登入對應至遠端伺服器remote_server
登入login_name
:
EXEC master.dbo.sp_addlinkedsrvlogin
@rmtsrvname = N'<remote_server>',
@useself = N'False',
@locallogin = NULL,
@rmtuser = N'<login_name>',
@rmtpassword = '<login_password>'
E. 檢查連結的登入
下列範例顯示已對應至連結伺服器的所有登入:
SELECT s.name AS server_name, ll.remote_name, sp.name AS principal_name
FROM sys.servers s
INNER JOIN sys.linked_logins ll
ON s.server_id = ll.server_id
INNER JOIN sys server_principals sp
ON ll.local_principal_id = sp.principal_id
WHERE s.is_linked = 1;