適用対象: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'
@useselfがfalse
されたときに@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 がログインの代わりにリンク サーバーに接続するときにローカル ログインのユーザー資格情報を使用することが示されます。 これは、@useselfがリンク サーバーのtrue
に設定されたsp_addlinkedsrvlogin
を、ローカル ユーザー名を指定せずに実行することと同じです。
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
に接続するようにマッピングを作成します。
EXECUTE sp_addlinkedsrvlogin 'Accounts';
又は
EXECUTE sp_addlinkedsrvlogin 'Accounts', 'true';
注
個々のログインに対して明示的なマッピングが作成されている場合は、そのリンク サーバーに存在する可能性があるグローバル マッピングよりも優先されます。
B. 別のユーザー資格情報を使用して特定のログインをリンク サーバーに接続する
次の例では、Windows ユーザーDomain\Mary
がログイン MaryP
を使用してリンク サーバー Accounts
に接続するようにマッピングを作成します。
<password>
を強力なパスワードに置き換えます。
EXECUTE sp_addlinkedsrvlogin 'Accounts', 'false', 'Domain\Mary', 'MaryP', '<password>';
注意事項
この例では、Windows 認証は使用しません。 パスワードは暗号化されずに送信されます。 パスワードは、ディスク、バックアップ、およびログ ファイルに保存されるデータ ソース定義とスクリプトに表示される場合があります。 この種の接続では管理者パスワードを使用しないでください。 環境に固有のセキュリティ ガイダンスについては、ネットワーク管理者に問い合わせてください。
C. 特定のローカル ログインをリモート サーバー ログインにマップする
Azure SQL Managed Instance など、リンク サーバーを介してリモート サーバーで Transact-SQL (T-SQL) クエリを実行する SQL エージェント ジョブを実行するには、ローカル サーバー上のログインと、T-SQL クエリを実行するアクセス許可を持つリモート サーバー上のログインとの間にマッピングを作成する必要があります。 SQL エージェント ジョブは、リンク サーバーを介してリモート サーバーに接続するときに、リモート ログインのコンテキストで T-SQL クエリを実行します。T-SQL クエリを実行するために必要なアクセス許可が必要です。
Azure SQL Managed Instance で SQL エージェント ジョブのログインをマッピングする場合は、SQL エージェント ジョブが sysadmin でない限り、リモート ログインにマップするローカル ログインが SQL エージェント ジョブの所有者である必要があります。この場合は、すべてのローカル ログインをマップする必要があります。 詳細については、 Azure SQL Managed Instance で SQL エージェント ジョブを確認してください。
ローカル サーバーで次のサンプル コマンドを実行して、リンク サーバー remote_server
に接続するときに、ローカル ログイン local_login_name
をリモート サーバー ログイン login_name
にマップします。
EXECUTE 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
に設定すると、すべてのローカル ログインをリモート サーバー上のログインにマップできます。
リンク サーバーを介してリモート サーバーにクエリを実行する sysadmin が所有する Azure SQL Managed Instance SQL エージェント ジョブを実行する場合は、すべてのローカル ログインをリモート サーバー ログインにマッピングする必要があります。 詳細については、 Azure SQL Managed Instance で SQL エージェント ジョブを確認してください。 SQL エージェント ジョブは、リンク サーバーを介してリモート サーバーに接続するときに、リモート ログインのコンテキストで T-SQL クエリを実行します。T-SQL クエリを実行するために必要なアクセス許可が必要です。
リンク サーバー remote_server
に接続するときに、ローカル サーバーで次のサンプル コマンドを実行して、すべてのローカル ログインをリモート サーバー ログイン login_name
にマップします。
EXECUTE 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;