
リンクサーバー(英語:Linked Server)はMicrosoft SQL Serverの機能で、ODBC準拠の外部データベースに対してTransact-SQLを直接実行できます。別のSQL Serverインスタンスや、Oracleなど他社DBのテーブルに対してフェデレーテッドクエリ・更新・分散トランザクションをT-SQLだけで処理できるのが最大のメリットです。
ただし、認証方式の選択ミスやクエリの書き方次第でパフォーマンスが大きく変わります。このガイドでは、作成手順・セキュリティ設定・よくあるエラーの対処法まで順を追って説明します。
リンクサーバーとは?
SQL ServerのリンクサーバーはSQL Serverインスタンスと外部データソースの接続を管理します。接続先は次のいずれかです。
別のSQL Serverインスタンス
OracleやMySQLなど他社データベース
ODBC準拠の非データベースデータソース
メリット
統合データアクセス:異なるDBのデータをローカルテーブルと同じT-SQLで操作できます。
分散トランザクション:複数のデータベースにまたがるトランザクションを1つのクエリで処理できます。
クエリプッシュダウン:OPENQUERYを使うと条件をリモート側に渡せるため、全データをローカルに引っ張らずに済みます。
デメリット
セキュリティリスク:認証設定を誤ると、意図しない権限昇格やデータ漏洩につながります。
パフォーマンスの落とし穴:クエリの書き方が悪いと、リモートテーブル全体をローカルに転送してからフィルタリングする最悪のケースになります。
管理コスト:リモートサーバーのIP・認証情報が変わった場合、リンクサーバーの設定を追随して更新する必要があります。
リンクサーバーが向いているケース
同一ネットワーク内の複数DBを、レプリケーションなしに連携したい場合(ETLを組むほどでもない規模)
複数システムにまたがるクエリやレポートをT-SQLで完結させたい場合
リモートデータを時々参照・更新するだけで、常時同期は不要な場合
ベストプラクティス
SQL Serverでリンクサーバーを作成する9つの手順
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名を指定します。
SQL Server Management Studio(SSMS)を開く:マシンでSSMSアプリケーションを起動します。
SQL Serverインスタンスに接続する:SSMSで、リンクサーバーを作成するSQL Serverインスタンスに接続します。

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

「リンクサーバー」にアクセスする:「サーバーオブジェクト」の下にある「リンクサーバー」フォルダーを右クリックします。
新しいリンクサーバーを作成する:コンテキストメニューから「新しいリンクサーバー」を選択してダイアログボックスを開きます。

リンクサーバーの詳細を指定する:ダイアログボックスでリンクサーバーの名前を指定し、サーバータイプとして「SQL Server」を選択します。「リンクサーバー」テキストボックスに入力した名前がリモートSQL Serverの識別名になります。
インスタンスの詳細を指定する:デフォルトインスタンスならコンピューター名を入力します。名前付きインスタンスなら「コンピューター名\インスタンス名」の形式で入力してください。

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

セットアップを完了する:「OK」をクリックしてリンクサーバーを作成します。
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をまたいだクエリをレポートツールから実行したい場合に有効です。
フェデレーテッドクエリ:データが複数のサーバーに分散していて、定期的に結合クエリを実行する必要がある場合。常時同期は不要だが、リアルタイムで最新データを参照したいケースに向いています。
SQL Serverリンクサーバーのよくあるエラーと解決方法
実際の現場でよく踏むエラーを4つ取り上げます。
エラー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:リンクサーバーのパフォーマンス低下
リモートテーブルへのクエリが異様に遅い場合、リモート側でフィルタリングできずテーブル全体を転送しているケースがほとんどです。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';
エラー4:タイムアウト・接続失敗
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・SAP・Dynamics 365・Google BigQueryなど、ODBCドライバーを直接持たないSaaSへの接続が必要な場面は増えています。CData ODBCドライバーを使えば、既存のリンクサーバー設定を活かしたまま300以上のデータソースに対応できます。
手順は4ステップです。
接続先サービス(例:Salesforce)向けのCData ODBCドライバーをインストールする
Windowsの「ODBCデータソースアドミニストレーター」でDSNを作成する
リンクサーバーの設定でプロバイダーをMSDASQL、データソースにDSN名を指定する
通常のT-SQLクエリでSalesforceのデータを取得・更新できる
既存のSQL Server環境やBIツールの設定を変えずに、クラウドデータへのリアルタイムアクセスが追加できます。
定期的なデータ同期・ETLパイプライン構築にはCData Syncもあります。ノーコードで300+ソースからSQL Serverへのデータ同期を自動化できます。
ODBCドライバーの30日間無料トライアルから始められます。サポートチームやCDataコミュニティもご活用ください。
※本記事はCData US ブログCData's Guide to Creating and Configuring a SQL Server Linked Serverの翻訳です。
Try CData today
Get direct, live connectivity to the data you need from any application, system, or database. Try CData Drivers today.
Try CData today