Open棟梁Project - マイクロソフト系技術情報 Wiki
リンクサーバとは
SQL ServerにOLE接続可能なDBMSを登録し
SQL Server経由でアクセス可能とする機能である。
SQL Server(本体) └リンクサーバ ├OLE接続:SQL Server(本体とは別のインスタンス) ├OLE接続:Oracle ├OLE接続:HiRDB :
それにより
などを実現する。
リンクサーバを実行するため以下の設定を行う。
リンクサーバ上のテーブルは下記形式での指定となる
[リンクサーバー名].[データベース名].[スキーマ名].[テーブル名]
シノニムを利用して別名をつけることも可能である
Create Synonym [シノニム名] For [リンクサーバー名].[データベース名].[スキーマ名].[テーブル名]
グローバルトランザクションを行う場合
SET XACT_ABORT ON
をトランザクション開始直後に発行するとグローバルトランザクションが実行可能となります。
以下の場合は、上記を発行する必要はありません。
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();
以下の手順で設定可能(Oracle10g → SQL Server 2005の事例)
Generic Connectivity Common Files 10.2.0.1.0 がインストールされていること
[%ORCALE_HOME%\HS\ADMIN\inithsodbc.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のサービスがケルベライズされていないためベースクライアント認証は不可能。
[%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からの分散トランザクションの動作は以下を参照。