マイクロソフト系技術情報 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。

目次

概要

リンクサーバとは
SQL ServerにOLE接続可能なDBMSを登録し
SQL Server経由でアクセス可能とする機能である。

SQL Server(本体)
└リンクサーバ
 ├OLE接続:SQL Server(本体とは別のインスタンス)
 ├OLE接続:Oracle
 ├OLE接続:HiRDB
 :


それにより

  • グローバル・トランザクション(2フェーズコミット)
  • 他種のDBMSをSQLServerと同じ手段でアクセス
    (例えば、リンクサーバで登録されたOracleをSystem.Data.SqlClient?で操作)
  • SQL Server、リンクサーバ間でテーブルをJOINして検索(リンクサーバ間でも可能)

などを実現する。

手順

動作環境準備

リンクサーバを実行するため以下の設定を行う。

  1. MS DTCサービスの開始
  2. ファイアウォールの設定 リンクサーバが別のサーバの場合、RPC通信が行えるように設定を行う。

    下記URL参照

リンクサーバを登録する手順

  1. Microsoft SQL Server Management StidioでSQLServerを開く
  2. オブジェクトエクスプローラにて[サーバーオブジェクト]-[リンクサーバー]を右クリックし[新しいリンクサーバー]を選択
  3. リンクサーバー名とDBMSへの接続文字列を設定しOKボタンを押下

実装上の考慮点

リンクサーバー上のテーブルの指定

リンクサーバ上のテーブルは下記形式での指定となる

[リンクサーバー名].[データベース名].[スキーマ名].[テーブル名]

シノニムを利用して別名をつけることも可能である

Create Synonym [シノニム名] For [リンクサーバー名].[データベース名].[スキーマ名].[テーブル名]

グローバルトランザクション(2フェーズコミット)の実行

  • グローバルトランザクションを行う場合
    SET XACT_ABORT ON

をトランザクション開始直後に発行すると
グローバルトランザクションが実行可能となる。

  • 以下の場合は、上記を発行する必要はない。
    • SQLServer(リンクサーバではない)に対してのみSQLを実行する場合
    • SELECT文のみ実行する場合
    • トランザクションを使わない場合(都度コミット)

サンプルコード

C#

using System.Data;
using System.Data.SqlClient;
SqlConnection con = new SqlConnection("User ID=user1;Password=password1;Initial Catalog=sample;Data Source=127.0.0.1");
SqlCommand com = new SqlCommand("", con);
SqlTransaction tra;

//SQL Serverへ接続
con.Open();

//グローバルトランザクション開始
tra = con.BeginTransaction();
com.Transaction = tra; 
com.CommandText = @"SET XACT_ABORT ON";
com.ExecuteNonQuery();

//SQL ServerへSQLを発行
com.CommandText = @"INSERT INTO [Table1] VALUES ('1','2','2')";
com.ExecuteNonQuery();

//リンクサーバへSQLを発行
com.CommandText = @"INSERT INTO [LOCALHOST\MSSQLSERVER].[sample].[dbo].[Table2] VALUES ('1','2','2')";
com.ExecuteNonQuery();
 
//SQL Server、リンクサーバ間でテーブルをJOINして検索するSQLを発行
DataSet ds = new DataSet();
SqlDataAdapter adp = new SqlDataAdapter(com);
com.CommandText = @"SELECT * FROM [Table1] a,[LOCALHOST\MSSQLSERVER].[sample].[dbo].[Table2] b where a.C1 = b.C1";
adp.Fill(ds);
dataGridView1.DataSource = ds.Tables[0];

//コミット
tra.Commit();

//切断
con.Close();

他のDBMSからSQL Serverにリンク

OracleやHiRDBなどを起点とする場合、
そちらの製品の機能を使用することになる。

調べると、前提条件が、

  • OLEDBではなくてODBC接続。
  • 分散トランザクションも必要。

など、製品によって前提条件が異なるようです。

Oracleからデータベースリンク接続

以下の手順で設定可能(Oracle10g → SQL Server 2005の事例)

前提条件

Generic Connectivity Common Files 10.2.0.1.0 がインストールされていること。

(Generic Connectivity は、

  • 異機種間サービス ODBC エージェントまたは
  • 異機種間サービス OLEDB エージェント

として実装されます。 )

ODBCの設定

  • ODBCのシステムDNSからドライバとしてSQL Serverを選択する。
  • データソース名を付与し、サーバのIPアドレス(+インスタンス名)を指定
    • [xxx.xxx.xxx.xxx\SQL2005]等と指定する。
  • 認証方式を選択(Windwos認証か、SQLServer認証)。
  • 必要に応じて、既定のデータ・ベースを選択。
  • その他、必要なオプションを設定。

inithsodbc.oraの編集

[%ORCALE_HOME%\HS\ADMIN\inithsodbc.ora]を編集する。

  • HS_FDS_CONNECT_INFO = [ODBCのデータソース名]
  • HS_FDS_TRACE_LEVEL = OFF

listener.oraの編集

[%ORCALE_HOME%\network\admin\listener.ora]を編集する。

(SID_DESCの追加)

(SID_LIST =
  (SID_DESC =
    (SID_NAME = PLSExtProc)
    (ORACLE_HOME = E:\oracle\product\10.2.0\db_1)
    (PROGRAM = extproc)
  )
  (SID_DESC =
    (SID_NAME = HSODBC)
    (ORACLE_HOME = E:\oracle\product\10.2.0\db_1)
    (PROGRAM = HSODBC)
  )
)

リスナー起動

Windows認証の場合は、以下の設定が必要になる。
#Oracleのサービスがケルベライズされていないためベースクライアント認証は不可能。

  • WindowsサービスからOracleのリスナーを停止し、
    ログイン・ユーザをSQL Serverに登録したユーザに変更する。

tnsnames.oraの編集

[%ORCALE_HOME%\network\admin\tnsnames.ora]を編集する。

(hsodbcの追加)

hsodbc =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    (CONNECT_DATA = (SID=hsodbc))
    (HS=OK)
  )

データベースリンクの作成

下記SQLで「データベースリンク」を作成する。

CREATE DATABASE LINK DBLINK_SQLSRV
USING 'HSODBC'
/

データベースリンクのテスト

SQL Serverのテーブルにアクセスするためには、テーブル名の後ろに、
アットーマーク(@)に続けてデータベースリンク名を指定する。

SELECT * FROM TBL_NAME@DBLINK_SQLSRV;

Oracleからの分散トランザクションの動作は以下を参照。

参考

Oracle

HiRDB


Tags: :データアクセス, :SQL Server


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-10-22 (月) 14:35:25 (2003d)