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

適用対象: SQL Server Azure SQL Managed Instance

リンク サーバーを使用すると、SQL Server データベース エンジンおよび Azure SQL Managed Instance では、リモート データ ソースからデータを読み取ったり、SQL Server のインスタンスの外部にあるリモート データベース サーバー (たとえば、OLE DB データ ソース) に対してコマンドを実行したりすることができます。 通常、リンク サーバーは、SQL Server の別のインスタンスまたは別のデータベース製品 (Oracle など) のテーブルを含んだ Transact-SQL ステートメントをデータベース エンジンから実行できるように構成されます。 サードパーティのデータベース プロバイダーや Azure Cosmos DB など、さまざまな種類の OLE DB データ ソースをリンク サーバーとして構成できます。

Note

リンク サーバーは、SQL Server および Azure SQL Managed Instance (一部制約あり) で使用できます。 Azure SQL データベースでは、リンク サーバーを使用できません。

リンク サーバーを使用する場合

リンク サーバーを使用すると、他のデータベース内のデータをフェッチおよび更新できる分散データベースを実装することができます。 リンク サーバーは、カスタム アプリケーション コードを作成したりリモート データ ソースから直接読み込んだりすることなく、データベース シャーディングを実装する必要があるシナリオで適切なソリューションです。 リンク サーバーには次の利点があります。

  • SQL Server の外部のデータにアクセスできる。

  • 企業内のさまざまなデータ ソースに対して分散クエリ、更新、コマンド、およびトランザクションを実行できる。

  • さまざまなデータ ソースを同じように処理できる。

リンク サーバーは、SQL Server Management Studio または sp_addlinkedserver ステートメントを使用して構成できます。 各 OLE DB プロバイダーは、必要なパラメーターの数と型という点で大きく異なります。 たとえば、プロバイダーによっては、sp_addlinkedsrvlogin を使用して接続のセキュリティ コンテキストを指定する必要があります。 SQL Server から OLE DB ソース上のデータを更新できる OLE DB プロバイダーもあれば、 読み取り専用データ アクセスに特化したものも存在します。 各 OLE DB プロバイダーの詳細については、該当する OLE DB プロバイダーのドキュメントを参照してください。

リンク サーバーのコンポーネント

リンク サーバーの定義では、次のオブジェクトを指定します。

  • OLE DB プロバイダー

  • OLE DB データ ソース

OLE DB プロバイダー は、特定のデータ ソースを管理し、相互運用する DLL です。 OLE DB データ ソース は、OLE DB を使用してアクセスできる特定のデータベースを識別します。 リンク サーバーの定義を使用してクエリが行われるデータ ソースは通常はデータベースですが、さまざまなファイルやファイル形式用の OLE DB プロバイダーが存在します。 これには、テキスト ファイル、ワークシートのデータ、およびフルテキスト検索の結果が含まれます。

SQL Server 2019 (15.x) 以降では、Microsoft OLE DB Driver for SQL Server (PROGID: MSOLEDBSQL) が既定の OLE DB プロバイダーです。 それより前のバージョンでは、SQL Server Native Client (PROGID: SQLNCLI11) が既定の OLE DB プロバイダーでした。

重要

SQL Server Native Client (SNAC と略されることがよくあります) は、SQL Server 2022 (16.x) と SQL Server Management Studio 19 (SSMS) から削除されました。 SQL Server Native Client OLE DB プロバイダー (SQLNCLI または SQLNCLI11) とレガシ Microsoft OLE DB Provider for SQL Server (SQLOLEDB) はどちらも、新しい開発には推奨されません。 今後は、新しい Microsoft OLE DB Driver (MSOLEDBSQL) for SQL Server に切り替えてください。

Microsoft Access と Excel ソースに対するリンク サーバーが Microsoft でサポートされるのは、32 ビットの Microsoft.JET.OLEDB.4.0 OLE DB プロバイダーを使う場合のみです。

Note

SQL Server 分散クエリは、必要な OLE DB インターフェイスを実装しているすべての OLE DB プロバイダーで処理できるように設計されています。 ただし、SQL Server は既定の OLE DB プロバイダーに対してテストされています。

リンク サーバーの詳細

次の図に、基本的なリンク サーバー構成を示します。

クライアント層、サーバー層、データベース サーバー層を示す図。

リンク サーバーは、通常は分散クエリの処理に使用します。 クライアント アプリケーションからリンク サーバー経由で分散クエリが実行されるときは、SQL Server でコマンドが解析され、OLE DB に要求が送信されます。 行セット要求は、プロバイダーに対するクエリの実行や、プロバイダーのベース テーブルを開くなどの形式をとります。

Note

データ ソースがリンク サーバー経由でデータを返すには、そのデータ ソースの OLE DB プロバイダー (DLL) が、SQL Server のインスタンスと同じサーバー上に存在する必要があります。

重要

OLE DB プロバイダーを使用する場合、SQL Server サービスを実行しているアカウントには、プロバイダーがインストールされているディレクトリとそのすべてのサブディレクトリに対する読み取り権限と実行権限が必要です。 これには、Microsoft によってリリースされたプロバイダー、およびすべてのサードパーティのプロバイダーが含まれます。

Note

リンク サーバーでは、完全委任を使用する場合に、Active Directory パススルー認証をサポートします。 SQL Server 2017 CU17 (14.x) 以降では、制約付き委任を使用したパススルー認証もサポートされています。ただし、リソース ベースの制約付き委任 はサポートされません。

プロバイダーの管理

SQL Server が OLE DB プロバイダーを読み込んで使用する方法を制御する一連のオプションは、レジストリで指定されます。

リンク サーバー定義の管理

リンク サーバーを設定するときは、接続情報とデータ ソース情報を SQL Server に登録します。 登録後、1 つの論理名でデータ ソースを参照できます。

ストアド プロシージャとカタログ ビューを使用して、リンク サーバーの定義を管理できます。

  • sp_addlinkedserver を実行して、リンク サーバーの定義を作成します。

  • sys.servers システム カタログ ビューに対してクエリを実行して、SQL Server の特定のインスタンスに定義されたリンク サーバーに関する情報を表示します。

  • sp_dropserver を実行して、リンク サーバーの定義を削除します。 このストアド プロシージャを使用して、リモート サーバーを削除することもできます。

SQL Server Management Studio を使用して、リンク サーバーを定義することもできます。 オブジェクト エクスプローラーで [サーバー オブジェクト]を右クリックし、 [新規作成]をポイントして、 [リンク サーバー]をクリックします。 リンク サーバー名を右クリックして [削除]をクリックすると、リンク サーバーの定義を削除できます。

リンク サーバーに対して分散クエリを実行する場合は、クエリを実行するデータ ソースごとに 4 つの部分で構成される完全修飾テーブル名を指定します。 この 4 つの部分で構成される名前は、<リンク サーバー名>.<カタログ>.<スキーマ>.<オブジェクト名> という形式にする必要があります。

Note

リンク サーバーは、どのサーバーで定義されたかを示す (ループ バックする) ように定義することができます。 ループバック サーバーは、単一のサーバー ネットワークで分散クエリを使用するアプリケーションをテストする際に最も有効です。 ループバック リンク サーバーはテスト用であり、分散トランザクションなどの多くの操作ではサポートされていません。

Azure SQL Managed Instance を備えたリンク サーバー

Azure SQL Managed Instance のリンク サーバーでは、SQL 認証と、Microsoft Entra ID (旧称 Azure Active Directory) による認証の、両方がサポートされています。

Azure SQL Managed Instance で SQL Agent ジョブを使用し、リンク サーバーを介してリモート サーバーにクエリを実行するには、sp_addlinkedsrvlogin を使用して、ローカル サーバーのログインからリモート サーバーのログインへのマッピングを作成します。 SQL Agent ジョブは、リンク サーバーを介してリモート サーバーに接続すると、リモート ログインのコンテキストで T-SQL クエリを実行します。 詳細については、「Azure SQL Managed Instance での SQL Agent ジョブ」をご覧ください。

Microsoft Entra 認証

Microsoft Entra 認証モードとしては、マネージド ID とパススルーの 2 つがサポートされています。 マネージド ID 認証を使用すると、ローカル ログインがリモート リンク サーバーに対してクエリを実行するのを許可することができます。 パススルー認証を使用すると、ローカル インスタンスで認証できるプリンシパルからリンク サーバー経由でリモート インスタンスにアクセスするのを許可することができます。

Azure SQL Managed Instance のリンク サーバーに Microsoft Entra パススルー認証を使用するには、次の前提条件が必要です。

  • リモート サーバー上のログインと同じプリンシパルが追加されます。
  • どちらのインスタンスも、SQL 信頼グループのメンバーです。

Note

パススルー モード用に構成されたリンク サーバーの既存の定義では、Microsoft Entra 認証がサポートされます。 この場合の唯一の要件は、SQL Managed Instance をサーバー信頼グループに追加することです。

次の制限事項は、Azure SQL Managed Instance のリンク サーバー向け Microsoft Entra 認証に適用されます。

  • Microsoft Entra 認証は、異なる Microsoft Entra テナントの SQL Managed Instance ではサポートされていません。
  • リンク サーバーに対する Microsoft Entra 認証は、OLE DB ドライバー バージョン 18.2.1 以降でのみサポートされます。

MSOLEDBSQL19 とリンク サーバー

現在、MSOLEDBSQL19 では、暗号化と信頼された証明書を使用せずにリンク サーバーを作成することはできません (自己署名証明書では不十分です)。 リンク サーバーが必要な場合は、MSOLEDBSQL のサポートされている既存のバージョンを使ってください。