リンク サーバーの作成 (SQL Server データベース エンジン)

適用対象:yesSQL Server (サポートされているすべてのバージョン) YesAzure SQL Managed Instance

この記事では、 SQL Server Management Studio (SSMS) または transact-sql SQL を使用して、リンクサーバーを作成し、別の SQL Server、Azure SQL Managed Instance、または別のデータソースからデータにアクセスする方法について説明します。 リンク サーバーを使用すると、SQL Server データベース エンジンおよび Azure SQL Managed Instance では、リモート データ ソースからデータを読み取ったり、SQL Server のインスタンスの外部にあるリモート データベース サーバー (たとえば、OLE DB データ ソース) に対してコマンドを実行したりすることができます。

背景

通常、リンク サーバーを構成する目的は、SQL Server の別のインスタンスまたは別のデータベース製品 (Oracle など) のテーブルを含んだ Transact-SQL ステートメントをデータベース エンジンから実行できるようにすることです。 サードパーティのデータベース プロバイダーや Azure Cosmos DB など、さまざまな種類のデータ ソースをリンク サーバーとして構成できます。

リンク サーバーを作成すると、このサーバーに対して分散クエリを実行でき、クエリを使用して複数のデータ ソースのテーブルを結合できます。 リンクサーバーが SQL Server または Azure SQL Managed Instance のインスタンスとして定義されている場合は、リモートストアドプロシージャを実行できます。

リンク サーバーの機能と必須の引数は大きく異なることがあります。 このトピックでは、一般的な例を紹介しますが、すべてのオプションについて説明しているわけではありません。 詳細については、「 sp_addlinkedserver (SQL transact-sql)」を参照してください。

アクセス許可

SQL transact-sql ステートメントを使用する場合は、サーバーに対するALTER ANY LINKED server権限またはsetupadmin固定サーバーロールのメンバーシップが必要です。 Management Studio を使用する場合は、 CONTROL SERVER権限またはsysadmin固定サーバーロールのメンバーシップが必要です。

SSMS を使用したリンク サーバーの作成

SSMS を使用してリンク サーバーを作成するには、以下の手順を使用します。

新しいリンク サーバーのダイアログを開く

SQL Server Management Studio (SSMS) の場合:

  • オブジェクト エクスプローラーを開きます。
  • [サーバー オブジェクト] を展開します。
  • [リンク サーバー] を右クリックします。
  • [新しいリンク サーバー] を選択します。

リンク サーバーのプロパティの [全般] ページを編集する

[全般] ページの [リンク サーバー] ボックスに、リンク先の SQL Server インスタンスの名前を入力します。

Note

SQL Server インスタンスが既定のインスタンスの場合は、 SQL Serverインスタンスをホストするコンピューターの名前を入力します。 SQL Server が名前付きインスタンスの場合は、コンピューターの名前とインスタンスの名前を入力します (例: Accounting\SQLExpress)。

必要に応じて、サーバーの種類と関連情報を指定します。

  • SQL Server
    リンクサーバーを Microsoft SQL Server のインスタンスまたは Azure SQL Managed Instance として指定します。 この方法でリンク サーバーを定義する場合、 [リンク サーバー] にはサーバーのネットワーク名を指定する必要があります。 さらに、サーバーから取得されるテーブルは、リンク サーバーのログイン用に定義されている既定のデータベースから取得されます。

  • [その他のデータ ソース]
    SQL Server 以外の OLE DB サーバーの種類を指定してください。 このオプションをクリックすると、その下にあるオプションを指定できるようになります。

    • プロバイダー
      リスト ボックスから OLE DB データ ソースを選択します。 OLE DB プロバイダーは、特定の PROGID を使用してレジストリに登録されます。

    • [製品名]
      リンク サーバーとして追加する OLE DB データ ソースの製品名を入力します。

    • データ ソース
      OLE DB プロバイダーで解釈されるデータ ソースの名前を入力します。 SQL Server のインスタンスに接続する場合は、インスタンス名を指定します。

    • [プロバイダー文字列]
      データ ソースに対応する OLE DB プロバイダーの一意なプログラム識別子 (PROGID) を入力します。 有効なプロバイダー文字列の例については、「 sp_addlinkedserver (SQL transact-sql)」を参照してください。

    • Location
      OLE DB プロバイダーで解釈されるデータベースの場所を入力します。

    • カタログ
      OLE DB プロバイダーへの接続を作成するときに使用するカタログの名前を入力します。

リンク サーバーのプロパティの [セキュリティ] ページを編集する

[セキュリティ] ページで、元のインスタンスがリンク サーバーに接続するときに使用するセキュリティ コンテキストを指定します。 ここでは、単独または組み合わせて使用できる 2 つの方法を構成します。 1 つ目の方法では、ローカル サーバーからのログインをリモート サーバーにマップします。2 つ目は、マップされていないログインをリンク サーバーで処理する方法です。

ログイン マッピングを追加する

必要に応じて、リンク サーバーを使用して特定のローカル サーバー ログインを認証する方法を指定できます。

[Local server login to remote server login mappings]\(ローカル サーバー ログインとリモート サーバー ログインとのマッピング\) で、マップするログインごとに以下のプロセスを繰り返します。

  • [追加] を選択します。

  • [ローカル ログイン] を指定します。

    リンク サーバーに接続できるローカル ログインを指定します。 ローカルログインには、SQL Server 認証を使用したログインか、Windows 認証ログインを使用できます。 Windows グループの使用はサポートされていません。 この一覧を使用して、特定のログインへの接続を制限することも、一部のログインが別のログインとして接続できるように設定することもできます。

Note

リモート SQL Server インスタンスに対する Windows 認証を使用するリンク サーバーで一般的な問題が、サービス プリンシパル名 (SPN) の問題から生じます。 詳細については、「クライアント接続でのサービス プリンシパル名 (SPN) のサポート」を参照してください。 Microsoft Kerberos Configuration Manager for SQL Server は、SQL Server と Kerberos の接続に関する問題のトラブルシューティングに役立つ診断ツールです。 Kerberos 認証の詳細については、「 Microsoft® Kerberos Configuration Manager for SQL Server®」をご覧ください。

  • [偽装する] を選択します (省略可能)。

    ローカル ログインからリンク サーバーにユーザー名とパスワードを渡します。 SQL Server 認証の場合、まったく同じ名前とパスワードを持つログインがリモートサーバーに存在している必要があります。 Windows ログインの場合、ログインがリンク サーバー上で有効である必要があります。

    権限借用を使用するには、委任の要件を満たすように構成する必要があります。

  • 権限借用を使用しない場合は、リモート ユーザーを指定します。

    リモート ユーザーを使用して、 [ローカル ログイン] で定義されたユーザーをマップできます。 リモートユーザーは、リモートサーバー上の SQL Server 認証ログインである必要があります。

  • 権限借用を使用しない場合は、リモート パスワードを指定します。

    • リモート ユーザーのパスワードを指定します。

必要に応じて、 [削除] を選択して既存のローカル ログインを削除します。

マッピング リストに存在しないログインの既定のセキュリティ コンテキストを指定する

ユーザーがドメイン ログインを使用して接続するドメイン環境では、 [ログインの現在のセキュリティ コンテキストを使用する] を選択することが最適な場合が多くあります。 ユーザーが SQL Server ログインを使用して元の SQL Server に接続する場合は、 [このセキュリティ コンテキストを使用する] をクリックして、リンク サーバーでの認証に必要な資格情報を指定することが最適です。

以下のオプションの 1 つを選択します。

  • [接続を許可しない]
    一覧で定義されていないログインについて、接続を許可しません。

  • [セキュリティ コンテキストを使用しない]
    一覧で定義されていないログインについて、セキュリティ コンテキストを使用せずに接続が作成されます。

  • [ログインの現在のセキュリティ コンテキストを使用する]
    一覧で定義されていないログインについて、ログインの現在のセキュリティ コンテキストを使用して接続が作成されます。 Windows 認証を使用してローカル サーバーに接続する場合は、リモート サーバーへの接続に Windows 資格情報を使用します。 SQL Server 認証を使用してローカルサーバーに接続している場合は、リモートサーバーへの接続にログイン名とパスワードが使用されます。 この場合、まったく同じ名前とパスワードを持つログインがリモート サーバーに存在する必要があります。

  • [このセキュリティ コンテキストを使用する]
    一覧で定義されていないログインについて、 [リモート ログイン] ボックスおよび [パスワード] ボックスで指定したログインとパスワードを使用して接続が作成されます。 リモートログインは、リモートサーバー上の SQL Server 認証ログインである必要があります。

リンク サーバーのプロパティの [サーバー オプション] ページを編集する (省略可能)

サーバー オプションを表示または指定する場合は、 [サーバー オプション] ページを選択します。 以下のどのオプションも編集できます。

  • [照合順序互換]
    リンク サーバーに対する分散クエリの実行に影響を与えます。 このオプションが true に設定されている場合、SQL Server は、文字セットと照合順序 (または並べ替え順序) に関して、リンクサーバーのすべての文字がローカルサーバーと互換性があると想定します。 これにより、SQL Server が文字型の列の比較をプロバイダーに送信できるようになります。 このオプションが設定されていない場合、SQL Server は常に文字型の列の比較をローカルで評価します。

    このオプションは、リンク サーバーに対応するデータ ソースがローカル サーバーと同じ文字セットと並べ替え順を持っていることが確認できている場合のみ設定します。

  • データ アクセス
    分散クエリ アクセスに対してリンク サーバーを有効または無効にします。

  • RPC
    指定されたサーバーからのリモート プロシージャ コール (RPC) を有効にします。

  • [RPC 出力]
    指定されたサーバーへの RPC を有効にします。

  • [リモート照合順序を使用]
    リモート列とローカル サーバーのどちらの照合順序を使用するかを指定します。

    true の場合、データソースの SQL Server にはリモート列の照合順序が使用され、SQL Server 以外のデータソースには [照合順序名] で指定された照合順序が使用されます。

    false の場合、分散クエリは常にローカル サーバーの既定の照合順序を使用します。[照合順序名] とリモート列の照合順序は無視されます。 既定値は false です。

  • [照合順序名]
    [リモート照合順序を使用する] が true で、データソースが SQL Server データソースでない場合に、リモートデータソースによって使用される照合順序の名前を指定します。 名前は SQL Server でサポートされている照合順序のいずれかである必要があります。

    このオプションは、SQL Server 以外の OLE DB データソースにアクセスする場合に使用しますが、照合順序は SQL Server の照合順序のいずれかと一致します。

    リンク サーバーは、そのサーバー内のすべての列で使用される単一の照合順序をサポートしている必要があります。 リンクサーバーが1つのデータソース内で複数の照合順序をサポートしている場合、またはリンクサーバーの照合順序が SQL Server の照合順序のいずれかと一致すると判断できない場合は、このオプションを設定しないでください。

  • [接続タイムアウト]
    リンク サーバーに接続する場合のタイムアウト値です (秒単位)。

    0の場合は、 sp_configureオプションの sp_configure 既定値を使用します。

  • [クエリ タイムアウト]
    リンク サーバーに対するクエリのタイムアウト値です (秒単位)。

    0の場合は、 sp_configureオプションの sp_configure 既定値を使用します。

  • [分散トランザクションのプロモーションを有効化]
    このオプションを使用すると、Microsoft 分散トランザクションコーディネーター (MS DTC) トランザクションを通じて、サーバー間のプロシージャのアクションを保護できます。 このオプションが TRUE の場合、リモート ストアド プロシージャを呼び出すと分散トランザクションが開始され、トランザクションは MS DTC に参加します。 詳細については、「 sp_serveroption (SQL transact-sql)」を参照してください。

リンク サーバーを保存する

[OK] を選択します。

SSMS でリンク サーバーのプロバイダー オプションを表示または編集する

すべてのプロバイダーで同じオプションを使用できるとは限りません。 たとえば、インデックスを利用できるデータ型と利用できないデータ型があります。 このダイアログボックスを使用すると、プロバイダーの機能を SQL Server 理解するのに役立ちます。 SQL Server はいくつかの一般的なデータプロバイダーをインストールしますが、データを提供する製品が変更された場合、SQL Server によってインストールされたプロバイダーが最新機能をすべてサポートしていない可能性があります。 データを提供する製品の機能の詳細については、その製品のマニュアルを参照してください。
SSMS でリンク サーバーの [プロバイダー オプション] ページを開くには、以下の手順を実行します。

  • オブジェクト エクスプローラーを開きます。
  • [サーバー オブジェクト] を展開します。
  • [リンク サーバー] を展開します。
  • [プロバイダー] を展開します。
  • プロバイダーを右クリックし、 [プロパティ] を選択します。

プロバイダー オプションは次のように定義されます。

  • [動的パラメーター]
    プロバイダーが、パラメーター化クエリに "?" パラメーター マーカー構文を使用できることを示します。 このオプションは、プロバイダーが ICommandWithParameters インターフェイスをサポートしており、パラメーター化マーカーとして "?" をサポートしている場合にのみ設定してください。 このオプションを設定すると、SQL Server がプロバイダーに対してパラメーター化クエリを実行できるようになります。 プロバイダーに対してパラメーター化クエリを実行できることにより、特定のクエリではパフォーマンスが向上します。

  • [入れ子になったクエリ]
    プロバイダーが、入れ子になった SELECT ステートメントを FROM 句内で使用できることを示します。 このオプションを設定すると、SQL Server は、from 句で SELECT ステートメントを入れ子にする必要がある特定のクエリをプロバイダーに委任できます。

  • [レベル 0 のみ]
    プロバイダーに対して起動できるのはレベル 0 の OLE DB インターフェイスだけです。

  • [InProcess 許可]

    SQL Server を使用すると、プロバイダーをインプロセスサーバーとしてインスタンス化できます。 このオプションが設定されていない場合、既定の動作では、SQL Server プロセス外でプロバイダーがインスタンス化されます。 SQL Server プロセス以外でプロバイダーをインスタンス化すると、プロバイダーのエラーから SQL Server プロセスが保護されます。 プロバイダーが SQL Server プロセスの外部でインスタンス化されている場合、長い列 (textntext、またはimage) を参照する更新や挿入は許可されません。

  • [トランザクション更新以外]
    ITransactionLocalが使用できない場合でも、SQL Server によって更新が許可されます。 このオプションがオンの場合、プロバイダーはトランザクションをサポートしないので、プロバイダーに対する更新を回復することはできません。

  • [アクセス パスとしてのインデックス]
    SQL Server は、プロバイダーのインデックスを使用してデータをフェッチしようとします。 既定では、インデックスはメタデータにのみ使用され、開かれることはありません。

  • [アドホック アクセス禁止]
    SQL Server では、OLE DB プロバイダーに対して OPENROWSET 関数と OPENDATASOURCE 関数を使用したアドホックアクセスは許可されません。 このオプションが設定されていない場合、SQL Server でもアドホックアクセスは許可されません。

  • ['Like' 演算子をサポートします]
    プロバイダーが LIKE キーワードを使用したクエリをサポートしていることを示します。

Transact-SQL を使用してリンク サーバーを作成する

transact-sql SQL を使用してリンクサーバーを作成するには、 sp_addlinkedserver (SQL transact-sql) ステートメント、 create LOGIN SQL (transact-sql)ステートメント、およびsp_addlinkedsrvlogin (transact-sql)ステートメントを使用します。

この例では、Transact-SQL を使用して別の SQL Server インスタンスへのリンク サーバーを作成します。

  1. クエリエディターで、次の transact-sql SQL コマンドを入力して、という名前 SRVR002\ACCTG の SQL Server のインスタンスにリンクします。

    USE [master]  
    GO  
    EXEC master.dbo.sp_addlinkedserver   
        @server = N'SRVR002\ACCTG',   
        @srvproduct=N'SQL Server';  
    GO  
    
    
  2. 次のコードを実行して、リンク サーバーを使用しているログインのドメイン資格情報を使用するようにリンク サーバーを構成します。

    EXEC master.dbo.sp_addlinkedsrvlogin   
        @rmtsrvname = N'SRVR002\ACCTG',   
        @locallogin = NULL ,   
        @useself = N'True';  
    GO  
    

補足情報: リンク サーバーの作成後に実行する手順

以下の手順は、リンク サーバーの検証に役立ちます。

リンク サーバーをテストします

現在のセキュリティ コンテキストでリンク サーバーの認証をテストするには、次の 2 つの方法のいずれかを検討します。

  • SSMS でリンク サーバーに接続できるかどうかをテストするには、オブジェクト エクスプローラーでリンク サーバーを参照し、リンク サーバーを右クリックして、 [接続テスト] を選択します。

  • T-SQL でリンク サーバーに接続できるかどうかをテストするには、たとえば、基本的なデータベース カタログ情報を取得するための単純な SELECT ステートメントを実行します。 この例では、リンク サーバーにあるデータベースの名前が返されます。

    SELECT name FROM [SRVR002\ACCTG].master.sys.databases;  
    GO  
    
    

リンク サーバーからテーブルを結合する

4 つの要素で構成される名前を使用して、リンク サーバー上のオブジェクトを参照します。 次のコードを実行して、ローカル サーバー上のすべてのログインとリンク サーバー上の対応するログインの一覧を取得します。

SELECT local.name AS LocalLogins, linked.name AS LinkedLogins  
FROM master.sys.server_principals AS local  
LEFT JOIN [SRVR002\ACCTG].master.sys.server_principals AS linked  
     ON local.name = linked.name;  
GO  

リンク サーバー ログインに対して NULL が返される場合、それはリンク サーバー上にログインが存在しないことを示します。 リンク サーバーが別のセキュリティ コンテキストを渡すように構成されている場合、またはリンク サーバーが匿名接続を許可する場合を除き、これらのログインではリンク サーバーを使用できません。

Azure SQL Managed Instance とリンク サーバー

Azure SQL Managed Instance を使用している場合は、「sp_addlinkedserver (Transact-SQL)」の次の例を参照してください。

次の手順

リンク サーバーの管理の詳細については、以下の記事を参照してください。