この記事では、Transact-SQLを使用してSQLServerでリンクサーバーを作成する例を示します。 T-SQLを使用すると、グラフィカルユーザーインターフェイス(SSMSなど)に依存せずにリンクサーバーを作成できます。
構文
T-SQLを使用してリンクサーバーを作成するには、sp_addlinkedserver
を使用します システムストアドプロシージャ。
公式の構文は次のようになります:
sp_addlinkedserver [ @server= ] 'server' [ , [ @srvproduct= ] 'product_name' ] [ , [ @provider= ] 'provider_name' ] [ , [ @datasrc= ] 'data_source' ] [ , [ @location= ] 'location' ] [ , [ @provstr= ] 'provider_string' ] [ , [ @catalog= ] 'catalog' ]
ほとんどの引数はオプションですが、リンクサーバー名を指定する必要があります。
また、リンクサーバーのデータソースまたは場所、およびプロバイダー名も指定することをお勧めします。 catalog
引数を使用すると、リンクサーバーがマップされるデフォルトのデータベースを指定できます。これらの各引数の説明については、Microsoftの公式ドキュメントを確認してください。
例–リンクサーバーを作成する
T-SQLを使用してリンクサーバーを作成するには、sp_addlinkedserver
を実行します。 リンクサーバーの名前とそのソースを渡す際のストアドプロシージャ。
リンクサーバーを作成する例を次に示します。
EXEC sp_addlinkedserver @server=N'Homer', @srvproduct=N'', @provider=N'MSOLEDBSQL', @datasrc=N'172.17.0.2,1433', @catalog='Music';>
この場合、リンクされたサーバー名は「Homer」であり、サーバーのIPアドレスを指定し、その後にTCPポートを指定します(私の場合、実際には同じマシン上のDockerコンテナーです)。必要に応じて、サーバー名とIPアドレス/ポートを変更します。 「音楽」というデフォルトのデータベースも指定します。
この例では、MSOLEDBSQL
を使用しています プロバイダー名として使用できますが、状況に応じて適切なプロバイダー名を使用できます。私の場合、SQLServerの別のインスタンスにリンクしています。
MSOLEDBSQL
に注意してください SQLServerの推奨プロバイダーです。以前にSQLOLEDB
を使用したことがある場合 またはSQLNCLI
、これらは両方とも非推奨になりました。 Microsoftは、OLE DBの廃止を解除し、2018年にリリースすることを決定しました。
Oracleにリンクする場合は、OraOLEDB.Oracle
を使用できます。 、MS Accessの場合、Microsoft.Jet.OLEDB.4.0
を使用できます。 (2002-2003形式にアクセスする場合)またはMicrosoft.ACE.OLEDB.12.0
(2007形式の場合)。公式ドキュメントには、さまざまなシナリオで使用するパラメータの表があります。
リンクサーバーのテスト
リンクサーバーを追加したら、sp_testlinkedserver
を使用できます テストするには:
EXEC sp_testlinkedserver Homer;
結果(成功した場合):
Commands completed successfully.
「ログインに失敗しました」というエラーが表示された場合は、リモートサーバーに対応するログインがない可能性があります。ローカルサーバーのログインと同じクレデンシャルで対応するログインが必要です。
リンクサーバーを最初に追加すると、ローカルサーバーのすべてのログインとリンクサーバーのリモートログインの間のデフォルトのマッピングが自動的に作成されます。 SQL Serverは、ログインに代わってリンクサーバーに接続するときに、ローカルログインの資格情報を使用します。ローカルログインに対応するログインがリモートサーバーにない場合は、「ログインに失敗しました」というエラーが表示されます。
リンクサーバーのログインを追加する
リンクサーバーで独自のログインを使用したくない場合は、使用する別のログインを指定できます。リモートサーバーに同じ資格情報で対応するログインがある限り、問題はありません。もちろん、リモートアカウントに、必要なことを実行するための適切な権限があることを確認する必要があります。
リンクサーバーのSQLServerログインを追加する例を次に示します。
EXEC sp_addlinkedsrvlogin @rmtsrvname=N'Homer', @useself=N'FALSE', @locallogin=NULL, @rmtuser=N'Marge', @rmtpassword=N'BigStrong#Passw0rd';
リンクサーバーを作成した後、ローカルサーバーでこれを実行します。実際の(リモート)リンクサーバーに同じクレデンシャルで対応するログインが必要です。
これにより、「Homer」というリンクサーバーの「Marge」というログインが追加されます。リモートサーバーが同じ資格情報でログインしている限り、ローカルサーバーはリンクサーバーにログインできます。
リモートサーバーに対応するログインを追加する例については、SQLServerでのリンクサーバーログインの追加を参照してください。
リンクサーバーを削除する
「Homer」と呼ばれるリンクサーバーと関連するすべてのログインを削除する例を次に示します。
EXEC sp_dropserver 'Homer', 'droplogins';
droplogins
引数はオプションですが、リモートサーバーとリンクサーバーのログインエントリが関連付けられているリンクサーバーを削除するときにこれを指定しない場合、またはレプリケーションパブリッシャーとして構成されている場合は、エラーメッセージが返されます。
リンクサーバーを削除するその他の例については、T-SQLを使用したリンクサーバーの削除を参照してください。
リンクサーバーに対して分散クエリを実行する
リンクサーバーを作成したので、それに対して分散クエリを実行する例を次に示します。
SELECT * FROM Homer.Music.dbo.Artists;
これとローカルクエリの唯一の違いは、リンクされたサーバー名をFROM
に追加する必要があることです。 条項。
このように:
LinkedServer.Database.Schema.Table
または、OPENQUERY()
を使用することもできます パススルークエリを実行するには:
SELECT * FROM OPENQUERY( Homer, 'SELECT * FROM Music.dbo.Artists;' );