次の方法で共有


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

適用対象: SQL Server Azure SQL Managed Instance

この記事では、SQL Server Management Studio (SSMS) または Transact-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 (Transact-SQL)」を参照してください。

アクセス許可

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

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

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

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

SQL Server Management Studio (SSMS)で:

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

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

[全般] ページの [リンク サーバー] ボックスに、リンク先の 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 (Transact-SQL)」を参照してください。

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

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

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

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

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

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

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

  1. [追加] を選択します。

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

    リンク サーバーに接続できるローカル ログインを指定します。 ローカル ログインは、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®」をご覧ください。

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

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

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

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

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

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

    • リモート ユーザーのパスワードを指定します。
  6. 必要に応じて、[削除] を選択して既存のローカル ログインを削除します。

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

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

次のいずれかのオプションを選択してください。

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

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

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

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

    注意事項

    [このセキュリティ コンテキストを使用して作成する] オプションを使用してリンク サーバーが構成されている場合、インスタンス上の任意のユーザーがこのコンテキストを使用してリモート リンク サーバーにアクセスできます。 これにより、悪用や悪意のある内部アクセスが意図しない形で行われる可能性があります。 リンク サーバーに提供される SQL 認証によるリモート ログイン には、リモート サーバーの最小限の必要なアクセス許可を付与することで、最小特権の原則を確保し、攻撃面を低減する必要があります。

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

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

  • [照合順序互換]
    リンク サーバーに対する分散クエリの実行に影響を与えます。 このオプションを 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 照合順序のいずれかと一致する場合に使用します。

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

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

    0 の場合は、sp_configureremote login timeout オプションの既定値が使用されます。

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

    0 の場合は、sp_configureremote query timeout オプションの既定値が使用されます。

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

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

[OK] を選択します。

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

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

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

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

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

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

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

  • [InProcess 許可]

    SQL Server で、インプロセス サーバーとしてプロバイダーのインスタンスを作成できます。 このオプションを設定しない場合、既定の動作として、SQL Server プロセス外でプロバイダーのインスタンスが作成されます。 SQL Serverのプロセス外でプロバイダーのインスタンスが作成されると、プロバイダーでエラーが発生しても、SQL Server プロセスは影響を受けません。 また、SQL Server のプロセス外でインスタンスが作成されたプロバイダーでは、長い列 (textntext、または image) を参照する更新や挿入はできません。

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

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

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

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

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

Transact-SQL を使ってリンク サーバーを作成するには、sp_addlinkedserver (Transact-SQL)CREATE LOGIN (Transact-SQL)、および sp_addlinkedsrvlogin (Transact-SQL) ステートメントを使います。

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

  1. クエリ エディターで、次の Transact-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)」の次の例を参照してください。

次のステップ

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