sp_addlinkedsrvlogin (Transact-SQL)

適用対象: SQL Server

SQL Server のローカル インスタンス上のログインとリモート サーバー上のセキュリティ アカウントの間のマッピングを作成または更新します。

Transact-SQL 構文表記規則

構文

sp_addlinkedsrvlogin
    [ @rmtsrvname = ] N'rmtsrvname'
    [ , [ @useself = ] 'useself' ]
    [ , [ @locallogin = ] N'locallogin' ]
    [ , [ @rmtuser = ] N'rmtuser' ]
    [ , [ @rmtpassword = ] N'rmtpassword' ]
[ ; ]

引数

[ @rmtsrvname = ] N'rmtsrvname'

ログイン マッピングが適用されるリンク サーバーの名前。 @rmtsrvnamesysname で、既定値はありません。

[ @useself = ] 'useself'

ローカル ログイン 偽装するか、ログインとパスワードを明示的に送信して rmtsrvname に接続するかを決定します。 @useselfvarchar(8) で、既定値は true です。

  • trueの値は、ログインが独自の資格情報を使用して@rmtsrvnameに接続し、@rmtuser引数と@rmtpassword引数が無視されることを指定します。
  • falseは、指定した@locallogin@rmtsrvnameに接続するために@rmtuser引数と@rmtpassword引数を使用することを指定します。

@rmtuser@rmtpasswordNULLに設定されている場合、リンク サーバーへの接続にログインまたはパスワードは使用されません。

[ @locallogin = ] N'locallogin'

ローカル サーバー上のログイン。 @localloginsysname で、既定値は NULL です。 NULL は、このエントリが、 @rmtsrvnameに接続するすべてのローカル ログインに適用されることを指定します。 NULLされていない場合、@localloginは SQL Server ログインまたは Windows アカウントにすることができます。 Windows アカウントは、SQL Server に直接、または Windows グループのメンバーシップを介してアクセスできる必要があります。

[ @rmtuser = ] N'rmtuser'

@useselfがfalseされたときに@rmtsrvnameに接続するために使用されるリモート ログイン。 @rmtusersysname で、既定値は NULL です。 リモート サーバーが Windows 認証を使用しない SQL Server のインスタンスである場合、 @rmtuser は SQL Server ログインです。

[ @rmtpassword = ] N'rmtpassword'

@rmtuserに関連付けられているパスワード。 @rmtpasswordsysname で、既定値は NULL です。

リターン コードの値

0 (成功) または 1 (失敗)。

解説

ユーザーがローカル サーバーにログオンし、リンク サーバー上のテーブルにアクセスする分散クエリを実行する場合、ローカル サーバーは、そのテーブルにアクセスするためにユーザーの代わりにリンク サーバーにログオンする必要があります。 sp_addlinkedsrvloginを使用して、ローカル サーバーがリンク サーバーへのサインインに使用する資格情報を指定します。

Note

リンク サーバー上のテーブルを使用するときに最適なクエリ プランを作成するには、クエリ プロセッサにリンク サーバーからのデータ分散統計が必要です。 テーブルの列に対するアクセス許可が制限されているユーザーは、すべての有用な統計を取得するための十分なアクセス許可を持っていない可能性があり、効率の低いクエリ プランを受け取り、パフォーマンスが低下する可能性があります。 リンク サーバーが 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 などです。

Note

シングルホップ シナリオでは委任を有効にする必要はありませんが、複数ホップのシナリオでは必要です。

SQL Server のローカル インスタンスで sp_addlinkedsrvlogin を実行することによって定義されたマッピングを使用して、リンク サーバーによって認証が実行されると、リモート データベース内の個々のオブジェクトに対するアクセス許可は、ローカル サーバーではなくリンク サーバーによって決定されます。

sp_addlinkedsrvlogin は、ユーザー定義トランザクション内から実行できません。

アクセス許可

サーバーに対する ALTER ANY LOGIN 権限が必要です。

A. 独自のユーザー資格情報を使用して、すべてのローカル ログインをリンク サーバーに接続する

次の例では、ローカル サーバーへのすべてのログインが、独自のユーザー資格情報を使用してリンク サーバー Accounts に接続するようにマッピングを作成します。

EXEC sp_addlinkedsrvlogin 'Accounts';

または

EXEC sp_addlinkedsrvlogin 'Accounts', 'true';

Note

個々のログインに対して明示的なマッピングが作成されている場合は、そのリンク サーバーに存在する可能性があるグローバル マッピングよりも優先されます。

B. 別のユーザー資格情報を使用して特定のログインをリンク サーバーに接続する

次の例では、ログイン MaryPとパスワード d89q3w4uを使用して、Windows ユーザーDomain\Maryがリンク サーバー Accountsに接続するようにマッピングを作成します。

EXEC sp_addlinkedsrvlogin 'Accounts', 'false', 'Domain\Mary', 'MaryP', 'd89q3w4u';

注意事項

この例では、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 でない限り、リモート ログイン mustにマップしたローカル ログインが SQL エージェント ジョブの所有者になります。この場合、ローカル ログインすべてマップする必要があります。 詳細については、Azure SQL Managed Instance を使用 SQL エージェント ジョブを確認してください。

ローカル サーバーで次のサンプル コマンドを実行して、リンク サーバー remote_serverに接続するときに、ローカル ログイン local_login_nameをリモート サーバー ログイン 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. すべてのローカル ログインをリモート サーバー ログインにマップする

localloginNULL に設定すると、ローカル ログインリモート サーバー上のログインにマップできます。

リンク サーバーを介してリモート サーバーに対してクエリを実行する、 sysadmin が所有する Azure SQL Managed Instance SQL エージェント ジョブを実行する場合は、すべてのローカル ログインをリモート サーバー ログインにマッピングする必要があります。 詳細については、Azure SQL Managed Instance を使用 SQL エージェント ジョブを確認してください。 SQL エージェント ジョブは、リンク サーバーを介してリモート サーバーに接続するときに、リモート ログインのコンテキストで 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;