翻訳者ノート
こんにちは!コンテンツチームの加藤です。
「別サーバーのデータをT-SQLで直接クエリしたい」という要件に、SQL Serverのリンクサーバー機能はシンプルな解決策を提供します。このガイドでは、SSMSのGUIとT-SQLスクリプトの両方を使った作成手順に加え、認証設定の選択ポイント、現場でよく踏むエラー4種類の対処法まで順を追って解説しています。クラウドSaaSへの接続拡張方法も合わせてご確認ください。 |
「別サーバーの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や認証情報 (クレデンシャル)が変わった際は、リンクサーバーの設定もあわせて更新が必要です。
リンクサーバーが向いているケース
ベストプラクティス
-- リモートサーバー側で読み取り専用ログインを作成する例
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名を指定します。
SQL Server Management Studio(SSMS)を開く:マシンでSSMSアプリケーションを起動します。
SQL Serverインスタンスに接続する:SSMSで、リンクサーバーを作成するSQL Serverインスタンスに接続します。

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

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

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

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

セットアップを完了する:「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ステップです。
接続先サービス(例:Salesforce)向けのCData ODBCドライバをインストールする
Windowsの「ODBCデータソースアドミニストレーター」でDSNを作成する
リンクサーバーの設定でプロバイダをMSDASQL、データソースにDSN名を指定する
通常の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以上のデータソースにリアルタイムアクセスできます。
無料トライアルをスタート