【徹底解説】SQL Server リンクサーバーの設定・作成・活用ガイド!SSMSとT-SQLで解説

by Dibyendu Datta, 翻訳:加藤龍彦 | February 28, 2024 | Last Updated: June 25, 2026

翻訳者ノート

こんにちは!コンテンツチームの加藤です。

「別サーバーのデータをT-SQLで直接クエリしたい」という要件に、SQL Serverのリンクサーバー機能はシンプルな解決策を提供します。このガイドでは、SSMSのGUIとT-SQLスクリプトの両方を使った作成手順に加え、認証設定の選択ポイント、現場でよく踏むエラー4種類の対処法まで順を追って解説しています。クラウドSaaSへの接続拡張方法も合わせてご確認ください。

SQL ServerリンクサーバーのアーキテクチャとODBC接続の概念図「別サーバーのDBを、ETLを組まずにT-SQLで直接クエリしたい」——そう考えたことはないでしょうか。SQL Serverのリンクサーバー機能は、ODBC準拠の外部データベースに対してTransact-SQLを直接実行できる仕組みで、フェデレーテッドクエリ・更新・分散トランザクションをT-SQLだけで完結させられます。

ただし、認証方式の選択やクエリの書き方を誤るとパフォーマンスに大きく影響します。本記事では、作成手順・セキュリティ設定・現場でよく踏むエラーの対処法まで、順を追って解説します。

リンクサーバーとは?

SQL ServerのリンクサーバーはSQL Serverインスタンスと外部データソースの接続を管理します。接続先は次のいずれかです。

  • 別のSQL Serverインスタンス

  • OracleやMySQLなど他社データベース

  • ODBC準拠の非データベースデータソース

メリット

  • 統合データアクセス:異なるDBのデータをローカルテーブルと同じT-SQLで操作できます。

  • 分散トランザクション:複数のデータベースにまたがるトランザクションを1つのクエリで処理できます。

  • クエリプッシュダウン:OPENQUERYを使うと条件をリモート側に渡せるため、全データをローカルに引っ張らずに済みます。

デメリット

  • セキュリティリスク:認証設定を誤ると、意図しない権限昇格やデータ漏洩につながります。

  • パフォーマンスの落とし穴:クエリの書き方が悪いと、リモートテーブル全体をローカルに転送してからフィルタリングする最悪のケースになります。例えば100行のローカルテーブルとリモートテーブルをJOINすると、最悪のケースで100回のリモートアクセスが発生します。

  • 管理コスト:リモートサーバーのIPや認証情報 (クレデンシャル)が変わった際は、リンクサーバーの設定もあわせて更新が必要です。

リンクサーバーが向いているケース

  • 同一ネットワーク内の複数DBを、レプリケーションなしに連携したい場合(ETLを組むほどでもない規模)。なお、常時同期が必要になった際のレプリケーション移行を検討されている方は、SQL Serverレプリケーション設定方法の徹底解説も参考になります。

  • 複数システムにまたがるクエリやレポートをT-SQLで完結させたい場合

  • リモートデータを時々参照・更新するだけで、常時同期は不要な場合

ベストプラクティス

  • セキュリティ:最小権限の原則を守り、リモートログインは必要なアカウントだけに絞ります。リモートサーバー側では読み取り専用の専用ログインを作成し、必要なスキーマのSELECT権限のみを付与することを推奨します。

  • パフォーマンス:リモートテーブルへのクエリにはOPENQUERYを使ってリモート側でフィルタリングしてください。後述のクエリパフォーマンスの最適化セクションで詳しく説明します。

-- リモートサーバー側で読み取り専用ログインを作成する例
CREATE LOGIN linked_readonly WITH PASSWORD = 'StrongP@ssw0rd';
CREATE USER linked_readonly FOR LOGIN linked_readonly;
GRANT SELECT ON SCHEMA::dbo TO linked_readonly;

SQL Serverでリンクサーバーを作成する方法は?

SSMSのGUIで作成する方法と、T-SQLで作成する方法の両方を説明します。

T-SQLコマンドでリンクサーバーを作成する

スクリプトで管理したい場合や、複数環境に同じ設定を展開する場合はT-SQLの方が確実です。

-- 1. リンクサーバーの作成(SQL Server間の場合)
EXEC sp_addlinkedserver
    @server     = 'REMOTE_SERVER',
    @srvproduct = '',
    @provider   = 'SQLNCLI',
    @datasrc    = '192.168.1.100';

-- 2. ログインマッピングの設定
EXEC sp_addlinkedsrvlogin
    @rmtsrvname  = 'REMOTE_SERVER',
    @useself     = 'FALSE',
    @locallogin  = NULL,
    @rmtuser     = 'remote_user',
    @rmtpassword = 'password';

-- 3. フェデレーテッドクエリの実行
SELECT * FROM [REMOTE_SERVER].[データベース名].[dbo].[テーブル名];

-- 4. リンクサーバー一覧の確認
SELECT name, product, provider, data_source
FROM sys.servers WHERE is_linked = 1;

-- 5. リンクサーバーの削除
EXEC sp_dropserver @server = 'REMOTE_SERVER', @droplogins = 'droplogins';

OracleやMySQLなどODBCドライバ経由で接続する場合は、@provider'MSDASQL'@datasrcにDSN名を指定します。

  1. SQL Server Management Studio(SSMS)を開く:マシンでSSMSアプリケーションを起動します。

  2. SQL Serverインスタンスに接続する:SSMSで、リンクサーバーを作成するSQL Serverインスタンスに接続します。

    SSMSでSQL Serverインスタンスへの接続画面

  3. 「サーバーオブジェクト」に移動する:SSMSのオブジェクトエクスプローラーペインで、「サーバーオブジェクト」フォルダーを展開します。

    SSMSオブジェクトエクスプローラーでサーバーオブジェクトを展開した画面

  4. 「リンクサーバー」にアクセスする:「サーバーオブジェクト」の下にある「リンクサーバー」フォルダーを右クリックします。

  5. 新しいリンクサーバーを作成する:コンテキストメニューから「新しいリンクサーバー」を選択してダイアログボックスを開きます。

    SSMSのリンクサーバーを右クリックして「新しいリンクサーバー」を選択する画面

  6. リンクサーバーの詳細を指定する:ダイアログボックスでリンクサーバーの名前を指定し、サーバータイプとして「SQL Server」を選択します。「リンクサーバー」テキストボックスに入力した名前がリモートSQL Serverの識別名になります。

  7. インスタンスの詳細を指定する:デフォルトインスタンスならコンピューター名を入力します。名前付きインスタンスなら「コンピューター名\インスタンス名」の形式で入力してください。

    リンクサーバー新規作成ダイアログでSQL Serverインスタンス名を入力する画面

  8. セキュリティ設定を構成する:「セキュリティ」ページで認証方式を選択します。選択肢の詳細は次のセクションで解説します。

    リンクサーバーのセキュリティページで認証方式を選択する画面

  9. セットアップを完了する:「OK」をクリックしてリンクサーバーを作成します。

SSMSのバージョンや環境によって、画面の表示が若干異なることがあります。

作成後の動作確認

リンクサーバーを作成したら、接続が正常に機能しているかを確認します。

-- 接続テスト(エラーがなければ成功)
EXEC sp_testlinkedserver 'REMOTE_SERVER';

-- リンクサーバー上のテーブル一覧を確認
EXEC REMOTE_SERVER.master.dbo.sp_tables;

SSMSのオブジェクトエクスプローラーでリンクサーバーのアイコンを展開しても、接続先のテーブル一覧を確認できます。エラーが発生する場合はパーミッションセクションの認証設定を見直してください。

SQL Serverリンクサーバーのパーミッション

セキュリティ設定には4つのオプションがあります。それぞれの動作と使いどころを整理します。

  • 接続しない:ログインマッピングを設定しません。匿名接続を試みますが通常は失敗します。テスト用途以外では使いません。

  • セキュリティコンテキストを使用せずに接続する:@useself = 'False' でNULLマッピングを明示的に設定します。「接続しない」とは別物で、セキュリティコンテキストを渡さないことを明示的に指定します。

  • ログインの現在のセキュリティコンテキストを使用して接続する:接続ユーザーのWindows認証をリモートサーバーにそのまま渡します。Active Directory環境ではこれが最も安全な選択です。

  • このセキュリティコンテキストを使用して接続する:指定したユーザー名とパスワードで全ユーザーが接続します。管理しやすい反面、最もリスクが高い設定です。認証情報の漏洩やパスワード変更時の影響範囲に注意してください。

SQL Serverリンクサーバーのユースケース

  • 小さいデータセットのクエリ:別のSQL ServerやODBC準拠DBに存在する参照データを、ローカルDBと結合してクエリしたい場合に向いています。

  • 小規模ETL:リモートサーバーからデータを取得してローカルに加工・ロードする処理を、SSISなどの専用ツールなしにT-SQLだけで完結させたい場合に使えます。

  • 異種DB環境でのレポーティング:SQL Server、Oracle、MySQLなど複数のDBをまたいだクエリをレポートツールから実行したい場合に有効です。

  • フェデレーテッドクエリ:データが複数のサーバーに分散していて、定期的に結合クエリを実行する必要がある場合。常時同期は不要だが、リアルタイムで最新データを参照したいケースに向いています。

  • クラウドDB環境:AWS RDS上にSQL Serverを構築している場合でも同様の設定が可能です。具体的な手順はAWS RDS for SQL Server にリンクサーバーを作成する方法で解説しています。

クエリパフォーマンスの最適化

リンクサーバー経由のクエリはネットワークオーバーヘッドが発生するため、書き方次第でパフォーマンスが大きく変わります。

OPENQUERYによるクエリプッシュダウン

リモートテーブルへのクエリが遅い場合、ローカル側でフィルタリングされているケースがほとんどです。OPENQUERYを使うと条件をリモート側に渡せるため、転送データ量を最小化できます。

-- 推奨:OPENQUERYでリモート側フィルタリング
SELECT * FROM OPENQUERY(REMOTE_SERVER,
    'SELECT * FROM dbo.Orders WHERE OrderDate > ''2024-01-01''');

-- 非推奨:ローカルでフィルタリング(全データ転送が発生)
SELECT * FROM [REMOTE_SERVER].[DB].[dbo].[Orders]
WHERE OrderDate > '2024-01-01';

ローカルテーブルとのJOINオーバーヘッド

ローカルテーブルとリモートテーブルをJOINする場合、実行計画によっては1行ごとにリモートアクセスが発生します。例えば100行のローカルテーブルとリモートテーブルをJOINすると、最悪のケースで100回のリモートアクセスが発生し、大きなオーバーヘッドになります。頻繁なJOINが必要なデータは、CData Syncで事前にローカルDBにコピーする方法も検討してください。

SSMSの実行計画でパフォーマンスを確認する

SSMSでクエリを実行する際に「実際の実行計画を含める」を有効にすると、Remote Queryオペレータが表示されます。このオペレータのコストが高い場合、リモート側への転送データ量が多いことを示しています。OPENQUERYに書き直してコストが下がるかどうかを確認してください。

SQL Serverリンクサーバーのよくあるエラーと解決方法

実際の現場でよく踏むエラーを3つ取り上げます。

エラー1:ログイン失敗(匿名ログイン)

Login failed for user 'NT AUTHORITY\ANONYMOUS LOGON'

Kerberos認証の設定ミスか、SPNが未登録のときに出ます。sp_addlinkedsrvloginでリモートログインを明示的にマッピングするか、@useself = 'TRUE'でWindows認証を使ってください。Active Directory環境ではまず、SPN(Service Principal Name)の登録状態を確認するのが先決です。

エラー2:OLEDBプロバイダエラー

The OLE DB provider "SQLNCLI" for linked server "..." does not support the required interface.

プロバイダが古いか、要求されているインターフェイスに未対応の場合に発生します。SQL Server Native Client(SQLNCLI)を最新版に更新するか、MSOLEDBSQL(Microsoft OLE DB Driver for SQL Server)への移行を検討してください。

エラー3:タイムアウト・接続失敗

TCP Provider: A connection attempt failed...が出る場合は、ファイアウォールでSQLポート(デフォルト1433)が開いているか確認してください。リモートサーバーのSQL Server Browserサービスが停止していても同じ症状が出ます。

リンクサーバーと代替手段の比較

ネイティブのリンクサーバーは、接続先がODBC準拠のDBに限られます。Salesforce・SAP・Dynamics 365のようなクラウドSaaSには直接つなげません。

手法

対応データソース

リアルタイム

設定難易度

向いているケース

SQL Server リンクサーバー(ネイティブ)

SQL Server, Oracle, ODBC準拠DB

同一ネットワーク内のDB間連携

CData ODBC ドライバ

300+ソース(Salesforce, SAP, Dynamics 365 等)

クラウドSaaS・非標準DBへのリアルタイム接続

CData Sync

300+ソース

❌(バッチ)

データウェアハウスへの定期同期・ETLパイプライン

SSIS(SQL Server Integration Services)

ODBC準拠全般

❌(バッチ)

複雑なETLパイプラインの構築

CData ODBCドライバでリンクサーバーの接続先を拡張する

ネイティブのリンクサーバーはODBC準拠DBとしか通信できません。CData ODBCドライバを挟むと、SalesforceやSAPなどODBC未対応のSaaSにもリンクサーバーとして接続できるようになります。

仕組みはシンプルです。CData SQL GatewayのTDSリモーティング機能が、SQL Server側から見て通常のSQL Serverインスタンスとして見える形でODBCデータソースを公開します。SSMSのGUIからでもsp_addlinkedserverからでも設定でき、詳細な手順はドキュメントをご覧ください。Salesforceを例にストアドプロシージャ経由で自動連携する具体的な構成例は、SQL ServerからSalesforceへストアドプロシージャで自動連携する方法で解説しています。

Salesforce・SAP・Dynamics 365・Google BigQueryなど、ODBCドライバを直接持たないSaaSと連携したい場面は少なくありません。CData ODBCドライバを使えば、既存のリンクサーバー構成をそのまま活かしながら、チームで300以上のデータソースへリアルタイムアクセスを追加できます。

手順は4ステップです。

  1. 接続先サービス(例:Salesforce)向けのCData ODBCドライバをインストールする

  2. Windowsの「ODBCデータソースアドミニストレーター」でDSNを作成する

  3. リンクサーバーの設定でプロバイダをMSDASQL、データソースにDSN名を指定する

  4. 通常のT-SQLクエリでSalesforceのデータを取得・更新できる

既存のSQL Server環境やBIツールの設定を変えることなく、クラウドデータへのリアルタイムアクセスを組織全体で活用できます。kintoneとの連携を例に設定手順を確認したい場合は、kintoneをSQL Serverのリンクサーバーとして接続する手順が画面キャプチャ付きで参考になります。

定期的なデータ同期・ETLパイプライン構築にはCData Syncもあります。ノーコードで300+ソースからSQL Serverへのデータ同期を自動化できます。レプリケーションの種類(スナップショット・トランザクション・マージ)ごとの使い分けについては、SQL Server レプリケーションの種類を徹底解説でまとめています。

まとめ

  • 接続範囲:ネイティブのSQL Serverリンクサーバーは、ODBC準拠のDBにしか接続できません。SalesforceやSAPなどのクラウドSaaSへの接続にはCData ODBCドライバの追加が必要です。

  • パフォーマンス:リモートテーブルへのクエリにはOPENQUERYを使ってリモート側でフィルタリングしてください。ローカルテーブルとのJOINは最悪ケースで行数分のリモートアクセスが発生します。

  • エラー対処:匿名ログインエラーはSPN登録確認、OLEDBエラーはMSOLEDBSQLへの移行、タイムアウトはファイアウォールのポート1433確認が初動の対処法です。

  • クラウドSaaS拡張:CData ODBCドライバを挟むことで、既存のリンクサーバー構成を変えずに300以上のデータソースへのリアルタイムアクセスが追加できます。

ODBCドライバの30日間無料トライアルから始められます。サポートチームCDataコミュニティもご活用ください。

※本記事はCData US ブログCData's Guide to Creating and Configuring a SQL Server Linked Serverの翻訳です。

リンクサーバーをSaaS接続に拡張する

ネイティブのリンクサーバーはODBC準拠DBにしか接続できず、SalesforceやSAPなどのクラウドSaaSには直接つなげません。CData ODBCドライバを使えば、既存のリンクサーバー設定をそのまま活かして300以上のデータソースにリアルタイムアクセスできます。

無料トライアルをスタート