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

このトピックでは、SQL Server Management Studio または Transact-SQL を使用してリンク サーバーを作成し、別の SQL Server からデータにアクセスする方法について説明します。 リンク サーバーを作成すると、複数のソースのデータを操作できます。 リンク サーバーは別の SQL Server インスタンスである必要はありませんが、そのようにするのが一般的です。

このトピックの内容

  • 作業を開始する準備:

    背景情報

    セキュリティ

  • 例:

    SQL Server Management Studio

    Transact-SQL

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

背景情報

リンク サーバーを使用すると、OLE DB データ ソースに対する異種の分散クエリの利用が可能になります。 リンク サーバーを作成すると、このサーバーに対して分散クエリを実行でき、クエリを使用して複数のデータ ソースのテーブルを結合できます。 リンク サーバーを SQL Server インスタンスとして定義した場合は、リモート ストアド プロシージャを実行できます。

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

セキュリティ

アクセス許可

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

[先頭に戻る]

リンク サーバーを作成する方法

次のいずれかを使用できます。

  • SQL Server Management Studio

  • Transact-SQL

SQL Server Management Studio の使用

SQL Server Management Studio を使用して別の SQL Server インスタンスへのリンク サーバーを作成するには

  1. SQL Server Management Studio で、オブジェクト エクスプローラーを開きます。次に、[サーバー オブジェクト] を展開し、[リンク サーバー] を右クリックして、[新しいリンク サーバー] をクリックします。

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

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

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

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

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

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

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

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

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

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

    注意

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

  3. [サーバーの種類][SQL Server] をクリックし、リンク サーバーが別の SQL Server インスタンスであることを指定します。

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

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

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

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

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

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

    • [追加]
      新しいローカル ログインを追加します。

    • [削除]
      既存のローカル ログインを削除します。

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

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

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

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

  5. 必要に応じてサーバー オプションを表示または指定する場合は、[サーバー オプション] ページをクリックします。

    • [照合順序互換]
      リンク サーバーに対する分散クエリの実行に影響を与えます。 このオプションを 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 query timeout オプションの既定値が使用されます。

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

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

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

  6. [OK] をクリックします。

プロバイダー オプションを表示するには

  • プロバイダーを使用可能にするオプションを表示するには、プロバイダー オプション] ページを使用します。

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

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

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

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

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

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

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

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

    • ['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
    

[先頭に戻る]

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

リンク サーバーをテストするには

  • 次のコードを実行して、リンク サーバーへの接続をテストします。 この例は、リンク サーバーにあるデータベースの名前を返します。

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

[先頭に戻る]

関連項目

参照

sp_addlinkedserver (Transact-SQL)

sp_serveroption (Transact-SQL)

概念

リンク サーバー (データベース エンジン)