sp_addlinkedserver (Transact-SQL)

適用対象: SQL ServerAzure SQL Managed Instance

リンク サーバーを作成します。 リンク サーバーは、OLE DB データ ソースに対する分散された異種クエリへのアクセスを提供します。 リンク サーバーを使用して sp_addlinkedserver作成した後、このサーバーに対して分散クエリを実行できます。 リンク サーバーが SQL Server のインスタンスとして定義されている場合は、リモート ストアド プロシージャを実行できます。

Note

Microsoft Entra ID は、以前は Azure Active Directory (Azure AD) と呼ばれていました。

Transact-SQL 構文表記規則

構文

sp_addlinkedserver
    [ @server = ] N'server'
    [ , [ @srvproduct = ] N'srvproduct' ]
    [ , [ @provider = ] N'provider' ]
    [ , [ @datasrc = ] N'datasrc' ]
    [ , [ @location = ] N'location' ]
    [ , [ @provstr = ] N'provstr' ]
    [ , [ @catalog = ] N'catalog' ]
    [ , [ @linkedstyle = ] linkedstyle ]
[ ; ]

引数

[ @server = ] N'server'

作成するリンク サーバーの名前。 @serverは sysname で、既定値はありません。

[ @srvproduct = ] N'srvproduct'

リンク サーバーとして追加する OLE DB データ ソースの製品名。 @srvproductは nvarchar(128) で、既定値は NULL. 値が SQL Server@provider、@datasrc@location@provstr、および@catalogの場合は、指定する必要はありません。

[ @provider = ] N'provider'

このデータ ソースに対応する OLE DB プロバイダーの一意のプログラム識別子 (PROGID)。 @provider、現在のコンピューターにインストールされている指定された OLE DB プロバイダーに対して一意である必要があります。 @providerは nvarchar(128) で、既定値は NULL.

  • SQL Server 2019 (15.x) 以前のバージョンでは、@providerを省略した場合は使用SQLNCLIされます。 使用 SQLNCLI すると、SQL Server が最新バージョンの SQL Server Native Client OLE DB プロバイダーにリダイレクトされます。 OLE DB プロバイダーは、指定の PROGID を使用してレジストリに登録されることが想定されています。 代わりに SQLNCLI、 を MSOLEDBSQL 使用することをお勧めします。

  • SQL Server 2022 (16.x) 以降では、プロバイダー名を指定する必要があります。 MSOLEDBSQL が推奨されます。 @providerを省略すると、予期しない動作が発生する可能性があります。

重要

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 に切り替えてください。

[ @datasrc = ] N'datasrc'

OLE DB プロバイダーによって解釈されるデータ ソースの名前。 @datasrcは nvarchar(4000) で、既定値は NULL. @datasrcは、OLE DB プロバイダーをDBPROP_INIT_DATASOURCE初期化するためのプロパティとして渡されます。

[ @location = ] N'location'

OLE DB プロバイダーによって解釈されるデータベースの場所。 @locationは nvarchar(4000) で、既定値は NULL. @locationは、OLE DB プロバイダーをDBPROP_INIT_LOCATION初期化するためのプロパティとして渡されます。

[ @provstr = ] N'provstr'

一意のデータ ソースを識別する OLE DB プロバイダー固有の接続文字列。 @provstrは nvarchar(4000) で、既定値は NULL. 引数 provstr は IDataInitialize に渡されるか、OLE DB プロバイダーを DBPROP_INIT_PROVIDERSTRING 初期化するためのプロパティとして設定されます。

SQL Server Native Client OLE DB プロバイダーに対してリンク サーバーを作成する場合は、SQL Server の特定のインスタンスを指定するキーワード (keyword)SERVER=servername\instancenameを使用SERVERしてインスタンスを指定できます。 サーバー名は SQL Server が実行されているコンピューターの名前であり、instancename はユーザーが接続される SQL Server の特定のインスタンスの名前です。

  • ミラーデータベースにアクセスするには、接続文字列にデータベース名を含める必要があります。 この名前は、データ アクセス プロバイダーがフェールオーバーを試行できるようにするために必要です。 データベースは、@provstr または @catalog パラメーターで指定できます。 必要に応じて、接続文字列はフェールオーバー パートナー名を指定することもできます。

  • ローカル ログインまたは sysadmin ロールの一部ではないログインから実行sp_addlinkedserverすると、次のエラーが表示されることがあります。

    Access to the remote server is denied because no login-mapping exists.
    

    この問題を解決するには、パラメーターをUser ID接続文字列に追加します。 次の例では、myUser接続文字列に渡されるユーザー ID を指定します。

    EXEC master.dbo.sp_addlinkedserver @server = N'LinkServerName',
        @provider = N'SQLNCLI',
        @srvproduct = 'MS SQL Server',
        @provstr = N'SERVER=serverName\InstanceName;User ID=myUser'
    
    EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname = N'LinkServerName',
        @locallogin = NULL,
        @useself = N'False',
        @rmtuser = N'myUser',
        @rmtpassword = N'*****'
    

    詳細については、「ログイン マッピングが存在しないため、リモート サーバーへのアクセスが拒否される」を参照してください

[ @catalog = ] N'catalog'

OLE DB プロバイダーへの接続時に使用するカタログ。 @catalogは sysname で、既定値は NULL. @catalogは、OLE DB プロバイダーをDBPROP_INIT_CATALOG初期化するためのプロパティとして渡されます。 リンク サーバーが SQL Server のインスタンスに対して定義されている場合、カタログは、リンク サーバーがマップされる既定のデータベースを参照します。

[ @linkedstyle = ] linkedstyle

単に情報を示すためだけに特定されます。 サポートされていません。 将来の互換性は保証されません。

リターン コードの値

0 (成功) または 1 (失敗)。

結果セット

ありません。

解説

次の表は、OLE DB を介してアクセスできるデータ ソースに対してリンク サーバーを設定する方法を示しています。 リンク サーバーは、特定のデータ ソースに対して複数の方法で設定できます。データ ソースの種類に対して複数の行を指定できます。 この表では、リンク サーバーの sp_addlinkedserver 設定に使用するパラメーター値も示します。

リモート OLE DB データ ソース OLE DB プロバイダー @srvproduct @provider @datasrc @location @provstr @catalog
SQL Server SQL Server Native Client OLE DB プロバイダー SQL Server 1 (既定)
SQL Server SQL Server Native Client OLE DB プロバイダー SQLNCLI SQL Server のネットワーク名 (既定のインスタンスの場合) データベース名 (省略可能)
SQL Server SQL Server Native Client OLE DB プロバイダー SQLNCLI servername\instancename (特定のインスタンスの場合) データベース名 (省略可能)
Oracle、バージョン 8 以降 Oracle Provider for OLE DB Any OraOLEDB.Oracle Oracle データベースに対する別名
Access/Jet Microsoft OLE DB Provider for Jet Any Microsoft.Jet.OLEDB.4.0 Jet データベース ファイルの完全なパス
ODBC データ ソース (ODBC data source) Microsoft OLE DB Provider for ODBC Any MSDASQL ODBC データ ソースのシステム DSN
ODBC データ ソース (ODBC data source) Microsoft OLE DB Provider for ODBC Any MSDASQL ODBC 接続文字列
ファイル システム Microsoft OLE DB Provider for Indexing Service Any MSIDXS Indexing Service カタログ名
Microsoft Excel スプレッドシート Microsoft OLE DB Provider for Jet Any Microsoft.Jet.OLEDB.4.0 Excel ファイルのフル パス Excel 5.0
IBM DB2 データベース Microsoft OLE DB Provider for DB2 Any DB2OLEDB Microsoft OLE DB Provider for DB2 のドキュメントを参照してください。 DB2 データベースのカタログ名

1 この方法でリンク サーバーを設定すると、リンク サーバーの名前が SQL Server のリモート インスタンスのネットワーク名と同じになります。 @datasrcを使用してサーバーを指定します。

2 "Any" は、製品名が何でもできることを示します。

SQL Server Native Client OLE DB プロバイダーは、プロバイダー名が指定されていない場合、または SQL Server が製品名として指定されている場合に SQL Server で使用されるプロバイダーです。 古いプロバイダー名 SQLOLEDB を指定した場合でも、カタログに永続化されると SQLNCLI に変更されます。

@datasrc@location@provstr、および@catalogパラメーターは、リンク サーバーが指すデータベースを識別します。 これらのパラメーターのいずれかが指定されている場合、 NULL対応する OLE DB 初期化プロパティは設定されません。

クラスター環境では、OLE DB データ ソースを指すファイル名を指定する場合は、汎用名前付け規則名 (UNC) または共有ドライブを使用して場所を指定します。

ストアド プロシージャ sp_addlinkedserver は、ユーザー定義トランザクション内では実行できません。

重要

現在、Azure SQL Managed Instance では、リモート データ ソースとして SQL Server、SQL Database、およびその他の SQL マネージド インスタンスのみがサポートされています。

重要

リンク サーバーを使用して sp_addlinkedserver作成すると、すべてのローカル ログインに既定の自己マッピングが追加されます。 SQL Server 以外のプロバイダーの場合、SQL Server 認証ログインは、SQL Server サービス アカウントでプロバイダーにアクセスできる場合があります。 管理イストレーターは、グローバル マッピングの削除に使用sp_droplinkedsrvlogin <linkedserver_name>, NULLすることを検討する必要があります。

アクセス許可

ステートメントには sp_addlinkedserver アクセス許可が必要です ALTER ANY LINKED SERVER 。 (SQL Server Management Studio [新しいリンク サーバー] ダイアログ ボックスは、sysadmin 固定サーバー ロールのメンバーシップを必要とする方法で実装されます)。

A. Microsoft SQL Server OLE DB プロバイダーを使用する

次の例では、SEATTLESales というリンク サーバーを作成します。 製品名は SQL Server で、プロバイダー名は使用されません。

USE master;
GO
EXEC sp_addlinkedserver
   N'SEATTLESales',
   N'SQL Server';
GO

次の例では、SQL Server S1_instance1 OLE DB ドライバーを使用して、SQL Server のインスタンスにリンク サーバーを作成します。

EXEC sp_addlinkedserver
   @server=N'S1_instance1',
   @srvproduct=N'',
   @provider=N'MSOLEDBSQL',
   @datasrc=N'S1\instance1';

次の例では、SQL Server S1_instance1 Native Client OLE DB プロバイダーを使用して、SQL Server のインスタンスにリンク サーバーを作成します。

重要

SQL Server Native Client OLE DB provider (SQLNCLI) は非推奨となりメイン新しい開発作業には使用しないことをお勧めします。 代わりに、新しい Microsoft OLE DB Driver for SQL Server (MSOLEDBSQL) を使用します。これは、最新のサーバー機能で更新されます。

EXEC sp_addlinkedserver
   @server=N'S1_instance1',
   @srvproduct=N'',
   @provider=N'SQLNCLI',
   @datasrc=N'S1\instance1';

B. Microsoft OLE DB Provider for Microsoft Access を使用する

Microsoft.Jet.OLEDB.4.0 プロバイダーは、2002-2003 形式を使用する Microsoft Access データベースに接続します。 次の例では、SEATTLE Mktg というリンク サーバーを作成します。

Note

この例では、Microsoft Access とサンプル Northwind データベースの両方がインストールされていること、およびデータベースが Northwind SQL Server インスタンスと同じサーバー上の C:\Msoffice\Access\Samples に存在することを前提としています。

EXEC sp_addlinkedserver
   @server = N'SEATTLE Mktg',
   @provider = N'Microsoft.Jet.OLEDB.4.0',
   @srvproduct = N'OLE DB Provider for Jet',
   @datasrc = N'C:\MSOffice\Access\Samples\Northwind.mdb';
GO

C: パラメーターで Microsoft OLE DB Provider for ODBC を datasrc 使用する

次の例では、Microsoft OLE DB Provider for ODBC (MSDASQL) と @datasrc パラメーターを使用する名前SEATTLE Payrollのリンク サーバーを作成します。

Note

リンク サーバーを使用する前には、指定した ODBC データ ソース名をサーバーのシステム DSN として定義する必要があります。

EXEC sp_addlinkedserver
   @server = N'SEATTLE Payroll',
   @srvproduct = N'',
   @provider = N'MSDASQL',
   @datasrc = N'LocalServer';
GO

D. Microsoft OLE DB Provider for Excel スプレッドシートを使用する

Microsoft OLE DB Provider for Jet を使用して 1997 - 2003 形式の Excel スプレッドシートにアクセスするリンク サーバー定義を作成するには、最初に Excel ワークシートの列と行を指定して、Excel で名前付き範囲を作成して選択します。 こうすると、分散クエリで範囲の名前をテーブル名として参照できるようになります。

EXEC sp_addlinkedserver 'ExcelSource',
   'Jet 4.0',
   'Microsoft.Jet.OLEDB.4.0',
   'c:\MyData\DistExcl.xls',
   NULL,
   'Excel 5.0';
GO

Excel スプレッドシートからデータにアクセスするには、セル範囲を名前に関連付けます。 先に設定したリンク サーバーを使って、テーブルとして指定されている名前付き範囲 SalesData にアクセスするときには、次のクエリを使用できます。

SELECT *
   FROM ExcelSource...SalesData;
GO

SQL Server がリモート共有にアクセスする doメイン アカウントで実行されている場合は、マップされたドライブの代わりに UNC パスを使用できます。

EXEC sp_addlinkedserver 'ExcelShare',
   'Jet 4.0',
   'Microsoft.Jet.OLEDB.4.0',
   '\\MyServer\MyShare\Spreadsheets\DistExcl.xls',
   NULL,
   'Excel 5.0';

E. Microsoft OLE DB Provider for Jet を使用してテキスト ファイルにアクセスする

次の例では、Access .mdb ファイル内のテーブルとしてテキスト ファイルにリンクするのではなく、直接テキスト ファイルにアクセスするリンク サーバーを作成します。 プロバイダーは 、 Microsoft.Jet.OLEDB.4.0 プロバイダー文字列は Text.

データ ソースは、テキスト ファイルを含むディレクトリの完全なパスです。 テキスト ファイルの構造を記述するschema.ini ファイルは、テキスト ファイルと同じディレクトリに存在する必要があります。 schema.ini ファイルを作成する方法の詳細については、Jet データベース エンジンのドキュメントを参照してください。

まず、リンク サーバーを作成します。

EXEC sp_addlinkedserver txtsrv, N'Jet 4.0',
   N'Microsoft.Jet.OLEDB.4.0',
   N'c:\data\distqry',
   NULL,
   N'Text';

ログイン マッピングを設定します。

EXEC sp_addlinkedsrvlogin txtsrv, FALSE, Admin, NULL;

リンク サーバー内のテーブルを一覧表示します。

EXEC sp_tables_ex txtsrv;

4 部構成の名前を使用して、テーブルの 1 つ (この場合 file1#txt) にクエリを実行します。

SELECT * FROM txtsrv...[file1#txt];

F. Microsoft OLE DB Provider for DB2 を使用する

次の例では、Microsoft OLE DB Provider for DB2 を使用する名前 DB2 のリンク サーバーを作成します。

EXEC sp_addlinkedserver @server = N'DB2',
    @srvproduct = N'Microsoft OLE DB Provider for DB2',
    @catalog = N'DB2',
    @provider = N'DB2OLEDB',
    @provstr = N'Initial Catalog=pubs;
       Data Source=DB2;
       HostCCSID=1252;
       Network Address=XYZ;
       Network Port=50000;
       Package Collection=admin;
       Default Schema=admin;';

G. クラウドおよびオンプレミス データベースでの分散クエリで使用するリンク サーバーとして Azure SQL データベースを追加する

Azure SQL データベースをリンク サーバーとして追加し、オンプレミスデータベースとクラウド データベースにまたがる分散クエリで使用できます。 これは、オンプレミスの企業ネットワークと Azure クラウドにまたがるデータベース ハイブリッド ソリューションのコンポーネントです。

SQL Server ボックス製品には分散クエリ機能が含まれています。これにより、ローカル データ ソースのデータと、リンク サーバーとして定義されたリモート ソース (SQL Server 以外のデータ ソースからのデータを含む) からのデータを結合するクエリを記述できます。 すべての Azure SQL データベース (論理サーバーのデータベースを除く) を個別の master リンク サーバーとして追加し、他のデータベースとしてデータベース アプリケーションで直接使用できます。

Azure SQL Database を使用する利点には、管理容易性、高可用性、スケーラビリティ、使い慣れた開発モデルの操作、リレーショナル データ モデルなどがあります。 データベース アプリケーションの要件によって、クラウドでの Azure SQL Database の使用方法が決まります。 すべてのデータを一度に Azure SQL Database に移動したり、再メインデータをオンプレミスに保持しながら、一部のデータを段階的に移動したりできます。 このようなハイブリッド データベース アプリケーションでは、Azure SQL Database をリンク サーバーとして追加できるようになりました。また、データベース アプリケーションは分散クエリを発行して、Azure SQL Database とオンプレミスのデータ ソースのデータを組み合わせることができます。

分散クエリを使用して Azure SQL データベースに接続する方法を説明する例を次に示します。

まず、SQL Server Native Client を使用して、1 つの Azure SQL データベースをリンク サーバーとして追加します。

EXEC sp_addlinkedserver
    @server = 'LinkedServerName',
    @srvproduct = '',
    @provider = 'sqlncli',
    @datasrc = 'ServerName.database.windows.net',
    @location = '',
    @provstr = '',
    @catalog = 'DatabaseName';

このリンク サーバーに資格情報とオプションを追加します。

EXEC sp_addlinkedsrvlogin
  @rmtsrvname = 'LinkedServerName',
  @useself = 'false',
  @rmtuser = 'LoginName',
  @rmtpassword = 'myPassword';

EXEC sp_serveroption 'LinkedServerName', 'rpc out', true;

次に、リンク サーバーを使用して、新しいテーブルを作成してデータを挿入する場合でも、4 部構成の名前を使用してクエリを実行します。

EXEC ('CREATE TABLE SchemaName.TableName(col1 int not null CONSTRAINT PK_col1 PRIMARY KEY CLUSTERED (col1) )') at LinkedServerName;
EXEC ('INSERT INTO SchemaName.TableName VALUES(1),(2),(3)') at LinkedServerName;

4 部構成の名前を使用してデータのクエリを実行します。

SELECT * FROM LinkedServerName.DatabaseName.SchemaName.TableName;

H. マネージド ID 認証を使用して Azure SQL Managed Instance のリンク サーバーを作成する

Note

Microsoft Entra ID は、以前は Azure Active Directory (Azure AD) と呼ばれていました。

マネージド ID 認証を使用してリンク サーバーを作成するには、独自の SQL マネージド インスタンスに置き換えて <managed_instance> 、次の T-SQL を実行します。 認証方法は、@provstr パラメーターで使用ActiveDirectoryMSIします。 必要に応じて、すべてのローカル ログインを許可するために使用 @locallogin = NULL することを検討してください。

EXEC master.dbo.sp_addlinkedserver
    @server = N'MyLinkedServer',
    @srvproduct = N'',
    @provider = N'MSOLEDBSQL',
    @provstr = N'Server=<mi_name>.<dns_zone>.database.windows.net,1433;Authentication=ActiveDirectoryMSI;';

EXEC master.dbo.sp_addlinkedsrvlogin
    @rmtsrvname = N'MyLinkedServer',
    @useself = N'False',
    @locallogin = N'user1@contoso.com';

マネージド ID による認証を有効にするには、Azure SQL Managed Instance に割り当てられたマネージド ID を、リモート マネージド インスタンスへのログインとして追加する必要があります。 システム割り当てとユーザー割り当ての両方のマネージド ID がサポートされています。

プライマリ ID が設定されている場合は使用され、それ以外の場合はシステム割り当てマネージド ID が使用されます。 マネージド ID が同じ名前で再作成される場合は、新しいマネージド ID アプリケーション ID と SQL Managed Instance サービス プリンシパル SID が一致しなくなったため、リモート インスタンスでのログインも再作成する必要があります。 これら 2 つの値が一致することを確認するには、次のクエリを使用して SID をアプリケーション ID に変換します。

SELECT convert(uniqueidentifier, sid) as MSEntraApplicationID
FROM sys.server_principals
WHERE name = '<managed_instance_name>';

I. パススルー Microsoft Entra 認証を使用した SQL Managed Instance リンク サーバーの作成

パススルー認証を使用してリンク サーバーを作成するには、次の T-SQL を実行し、独自の SQL マネージド インスタンス サーバーに置き換えます <managed_instance>

EXEC master.dbo.sp_addlinkedserver
    @server = N'MyLinkedServer',
    @srvproduct = N'',
    @provider = N'MSOLEDBSQL',
    @datasrc = N'<mi_name>.<dns_zone>.database.windows.net,1433';

パススルー認証では、ローカル ログインのセキュリティ コンテキストがリモート インスタンスに引き継がされます。 パススルー認証では、ローカルとリモートの両方の Azure SQL Managed Instance にログインとして Microsoft Entra プリンシパルを追加する必要があります。 両方のマネージド インスタンスがサーバー信頼グループに存在する必要があります。 要件が満たされたら、ユーザーはローカル インスタンスにサインインし、リンク サーバー オブジェクトを使用してリモート インスタンスにクエリを実行できます。