SQL Serverでリンクサーバーを構成する場合、ログインの設定が混乱することがあります。この記事では、SQLServerがローカルログインをリンクサーバー上のリモートログインにマップする方法の概要を説明することを目的としています。
sp_addlinkedserver
を使用する場合 SQL Serverでリンクサーバーを作成するために、ローカルサーバーのすべてのログインとリンクサーバーのリモートログインの間のデフォルトのマッピングが自動的に作成されます。 SQL Serverは、ログインに代わってリンクサーバーに接続するときに、ローカルログインの資格情報を使用します。
したがって、ローカルログインに、リンクされたサーバーに同じ資格情報を持つ対応するログインがあり、適切な権限がある場合は、ローカルログインを使用して接続できます。リンクサーバーのログインを追加する必要はありません(自分のローカルログインを使用して接続できる場合)。
ただし、ローカルログインがない リンクサーバーに対応するログインがある(そして同じ資格情報を使用している)場合、接続は失敗します。
このような場合は、sp_addlinkedsrvlogin
を使用できます。 リンクサーバーに対応するログインがない場合でも、ローカルログインがリンクサーバーに接続できるように、リンクサーバーのログインを作成します。
これを行うと、リンクサーバーに対応するログインがあるかどうかに応じて、リンクサーバーで異なるユーザーが使用される可能性があります。
Windows認証モードを使用してSQLServerに接続しているユーザーの場合、クライアントと送信サーバーでセキュリティアカウントの委任が利用可能であり、プロバイダーがWindows認証モードをサポートしている限り、SQLServerはWindowsセキュリティ資格情報を自動的に使用できます。
このページの例では、SQL Serverログインを使用しています(Windows認証モードは使用していません)。これらの例は、ローカルSQLServerログインを使用してさまざまなシナリオでリンクサーバーにログインしたときに得られる結果を示しています。
例1-明示的なログインのないリンクサーバー
まず、Homerというリンクサーバーを作成しますが、関連するログインは作成しません。
EXEC sp_addlinkedserver @server=N'Homer', @srvproduct=N'', @provider=N'MSOLEDBSQL', @datasrc=N'172.17.0.2', @catalog='Music';
これにより、ローカルサーバーのすべてのログインとリンクサーバーのリモートログインの間にデフォルトのマッピングが自動的に作成されます。
次に、さまざまなローカルログインを使用して、リンクサーバーに対して次のパススルークエリを実行してみます。
SELECT * FROM OPENQUERY( Homer, 'SELECT CURRENT_USER AS ''CURRENT_USER'', ORIGINAL_LOGIN() AS ''ORIGINAL_LOGIN''' );
クエリ結果は次のとおりです。
sa
Login failed for user 'sa'.
ログインの詳細 :両方のサーバーに「sa」というログインがありますが、パスワードが異なります。どちらもシステム管理者のメンバーです サーバーの役割。
リサ
+----------------+------------------+ | CURRENT_USER | ORIGINAL_LOGIN | |----------------+------------------| | dbo | Lisa | +----------------+------------------+
ログインの詳細 :両方のサーバーに「Lisa」というログインがあり、同じパスワードを使用しています。どちらもシステム管理者のメンバーです サーバーの役割。
ミルハウス
Login failed for user 'Milhouse'.
ログインの詳細 :このログインはローカルサーバーでのみ行われます。リンクサーバーに対応するログインがありません。
Apu
Login failed for user 'Apu'.
ログインの詳細 :このログインはローカルサーバーでのみ行われます。リンクサーバーに対応するログインがありません。
例2–リンクサーバーのログインを追加する
次に、リンクサーバーのログインを作成します。
EXEC sp_addlinkedsrvlogin @rmtsrvname=N'Homer', @useself=N'FALSE', @locallogin=NULL, @rmtuser=N'Maggie', @rmtpassword=N'BigStrong#Passw0rd';
このログインはリモートサーバーでのログインに対応しているため、それらの間にマッピングが作成されます。
これで、各ユーザーは次のクエリを再度実行します。
SELECT * FROM OPENQUERY( Homer, 'SELECT CURRENT_USER AS ''CURRENT_USER'', ORIGINAL_LOGIN() AS ''ORIGINAL_LOGIN''' );
クエリ結果は次のとおりです。
sa
+----------------+------------------+ | CURRENT_USER | ORIGINAL_LOGIN | |----------------+------------------| | Maggie | Maggie | +----------------+------------------+
ログインの詳細 :両方のサーバーに「sa」というログインがありますが、パスワードが異なります。どちらもシステム管理者のメンバーです サーバーの役割。
リサ
+----------------+------------------+ | CURRENT_USER | ORIGINAL_LOGIN | |----------------+------------------| | Maggie | Maggie | +----------------+------------------+
ログインの詳細 :両方のサーバーに「Lisa」というログインがあり、同じパスワードを使用しています。どちらもシステム管理者のメンバーです サーバーの役割。
ミルハウス
+----------------+------------------+ | CURRENT_USER | ORIGINAL_LOGIN | |----------------+------------------| | Maggie | Maggie | +----------------+------------------+
ログインの詳細 :このログインはローカルサーバーでのみ行われます。リンクサーバーに対応するログインがありません。
Apu
+----------------+------------------+ | CURRENT_USER | ORIGINAL_LOGIN | |----------------+------------------| | Maggie | Maggie | +----------------+------------------+
ログインの詳細 :このログインはローカルサーバーでのみ行われます。リンクサーバーに対応するログインがありません。
そのため、すべてのローカルログインがリンクサーバーに接続できました。リンクサーバーに対応するリモートログインがないログインでも接続できました。これは、全員がMaggieログインを使用したためです。ありがとうマギー!
例3–ログインを制限する
次に、リンクサーバーのログインを更新して、Milhouseに制限します。
ただし、これを行うには、リンクサーバーを削除して再作成する必要があります。これを行わないと、SQL Serverは既存のマッピングを使用し、上記と同じ結果が得られます。
EXEC sp_dropserver 'Homer', 'droplogins'; EXEC sp_addlinkedserver @server=N'Homer', @srvproduct=N'', @provider=N'MSOLEDBSQL', @datasrc=N'172.17.0.2', @catalog='Music'; EXEC sp_addlinkedsrvlogin @rmtsrvname=N'Homer', @useself=N'FALSE', @locallogin='Milhouse', @rmtuser=N'Maggie', @rmtpassword=N'BigStrong#Passw0rd';
したがって、この場合は@locallogin='Milhouse'
を使用します (@locallogin=NULL
の代わりに 前の例のように)。これにより、1つのローカルログイン(Milhouse)のログインマッピングが追加されます。
各ユーザーは、次のクエリを再度実行します。
SELECT * FROM OPENQUERY( Homer, 'SELECT CURRENT_USER AS ''CURRENT_USER'', ORIGINAL_LOGIN() AS ''ORIGINAL_LOGIN''' );
クエリ結果は次のとおりです。
sa
Msg 18456, Level 14, State 1, Line 1 Login failed for user 'sa'.
ログインの詳細 :両方のサーバーに「sa」というログインがありますが、パスワードが異なります。どちらもシステム管理者のメンバーです サーバーの役割。
リサ
+----------------+------------------+ | CURRENT_USER | ORIGINAL_LOGIN | |----------------+------------------| | dbo | Lisa | +----------------+------------------+
ログインの詳細 :両方のサーバーに「Lisa」というログインがあり、同じパスワードを使用しています。どちらもシステム管理者のメンバーです サーバーの役割。
ミルハウス
+----------------+------------------+ | CURRENT_USER | ORIGINAL_LOGIN | |----------------+------------------| | Maggie | Maggie | +----------------+------------------+
ログインの詳細 :このログインはローカルサーバーでのみ行われます。リンクサーバーに対応するログインがありません。
Apu
Msg 18456, Level 14, State 1, Line 1 Login failed for user 'Apu'.
ログインの詳細 :このログインはローカルサーバーでのみ行われます。リンクサーバーに対応するログインがありません。
したがって、ここで重要なポイントは、ログインを1つのローカルログインのみに制限した場合でも、他のローカルログインがリンクサーバーに接続するのを妨げないということです。リンクサーバーに対応するログインがある場合は、sp_addlinkedserver
のときに作成された独自のログインマッピングを使用してアクセスできます。 実行されました。
例4–実際には1回のログインに制限する
本当に1回のログインのみに制限し、それ以上に制限したくない場合は、sp_droplinkedsrvlogin
を使用できます。 sp_addlinkedserver
のすべてのログインマッピングを削除します sp_addlinkedsrvlogin
を実行する前に作成します 。
EXEC sp_dropserver 'Homer', 'droplogins'; EXEC sp_addlinkedserver @server=N'Homer', @srvproduct=N'', @provider=N'MSOLEDBSQL', @datasrc=N'172.17.0.2', @catalog='Music'; EXEC sp_droplinkedsrvlogin 'Homer', NULL; EXEC sp_addlinkedsrvlogin @rmtsrvname=N'Homer', @useself=N'FALSE', @locallogin='Milhouse', @rmtuser=N'Maggie', @rmtpassword=N'BigStrong#Passw0rd';
次に、ログインするたびにクエリをもう一度実行してみましょう。
SELECT * FROM OPENQUERY( Homer, 'SELECT CURRENT_USER AS ''CURRENT_USER'', ORIGINAL_LOGIN() AS ''ORIGINAL_LOGIN''' );
クエリ結果は次のとおりです。
sa
Msg 7416, Level 16, State 1, Line 1 Access to the remote server is denied because no login-mapping exists.
ログインの詳細 :両方のサーバーに「sa」というログインがありますが、パスワードが異なります。どちらもシステム管理者のメンバーです サーバーの役割。
リサ
Msg 7416, Level 16, State 1, Line 1 Access to the remote server is denied because no login-mapping exists.
ログインの詳細 :両方のサーバーに「Lisa」というログインがあり、同じパスワードを使用しています。どちらもシステム管理者のメンバーです サーバーの役割。
ミルハウス
+----------------+------------------+ | CURRENT_USER | ORIGINAL_LOGIN | |----------------+------------------| | Maggie | Maggie | +----------------+------------------+
ログインの詳細 :このログインはローカルサーバーでのみ行われます。リンクサーバーに対応するログインがありません。
Apu
Msg 7416, Level 16, State 1, Line 1 Access to the remote server is denied because no login-mapping exists.
ログインの詳細 :このログインはローカルサーバーでのみ行われます。リンクサーバーに対応するログインがありません。
リモートログインの構成
リンクサーバーに正常に接続することは、プロセスの最初のステップにすぎません。接続すると、ログインがマップされているリモートユーザーの権限によって作業が実行できるようになります。
たとえば、Maggieが次のようにリモートサーバーで作成された場合:
CREATE LOGIN Maggie WITH PASSWORD = 'BigStrong#Passw0rd'; USE Music; CREATE USER Maggie FOR LOGIN Maggie; GRANT SELECT ON DATABASE::Music TO Maggie;
彼女にできることは、SELECT
を実行することだけです。 「音楽」データベースに対するステートメント。したがって、Maggieのログインを使用してリンクサーバーに接続する人は、それだけに制限されます。
必要な権限のみを付与し、それ以上は付与しないことをお勧めします。
公式ドキュメント
この記事は、ログインがリンクサーバーでどのように機能するかについての概要を説明することを目的としています。ここでは取り上げなかったシナリオは他にもたくさんあります。
詳細については、Microsoftのドキュメントへの次のリンクをご覧ください。
-
sp_addlinkedserver
-
sp_addlinkedsrvlogin
-
sp_testlinkedserver
-
sp_droplinkedsrvlogin
-
sp_dropserver
-
OPENQUERY()