[[Open棟梁Project>http://opentouryo.osscons.jp/]] - [[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]] -[[戻る>SQL Server]] * 目次 [#t2fb1457] #contents *概要 [#od9f9594] リンクサーバとは~ 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して検索(リンクサーバ間でも可能) などを実現する。 *手順 [#jda352c6] **動作環境準備 [#a7eb12c5] リンクサーバを実行するため以下の設定を行う。 +MS DTCサービスの開始 +ファイアウォールの設定 リンクサーバが別のサーバの場合、RPC通信が行えるように設定を行う。~ ~ 下記URL参照~ -technet:分散トランザクション コーディネーター~ http://technet.microsoft.com/ja-jp/library/cc759136.aspx~ **リンクサーバを登録する手順 [#p531e60b] +Microsoft SQL Server Management StidioでSQLServerを開く +オブジェクトエクスプローラにて[サーバーオブジェクト]-[リンクサーバー]を右クリックし[新しいリンクサーバー]を選択 +リンクサーバー名とDBMSへの接続文字列を設定しOKボタンを押下 *実装上の考慮点 [#q834be7b] **リンクサーバー上のテーブルの指定 [#x6b1c1f7] リンクサーバ上のテーブルは下記形式での指定となる [リンクサーバー名].[データベース名].[スキーマ名].[テーブル名] シノニムを利用して別名をつけることも可能である Create Synonym [シノニム名] For [リンクサーバー名].[データベース名].[スキーマ名].[テーブル名] **グローバルトランザクション(2フェーズコミット)の実行 [#c9af68ec] グローバルトランザクションを行う場合 SET XACT_ABORT ON をトランザクション開始直後に発行するとグローバルトランザクションが実行可能となります。~ 以下の場合は、上記を発行する必要はありません。~ -SQLServer(リンクサーバではない)に対してのみSQLを実行する場合 -SELECT文のみ実行する場合 -トランザクションを使わない場合(都度コミット) *サンプルコード [#b72dc034] **C# [#la10b024] 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(); *Oracleからデータベースリンク接続 [#xc395092] 以下の手順で設定可能(Oracle10g → SQL Server 2005の事例) **前提条件 [#cfacd8f8] Generic Connectivity Common Files 10.2.0.1.0 がインストールされていること **ODBCの設定 [#u0c16471] -ODBCのシステムDNSからドライバとしてSQL Serverを選択する。 -データソース名を付与し、サーバのIPアドレス(+インスタンス名)を指定 --[xxx.xxx.xxx.xxx\SQL2005]等と指定する。 -認証方式を選択(Windwos認証か、SQLServer認証)。 -必要に応じて、既定のデータ・ベースを選択。 -その他、必要なオプションを設定。 **inithsodbc.oraの編集 [#q281e786] [%ORCALE_HOME%\HS\ADMIN\inithsodbc.ora]を編集します。 -HS_FDS_CONNECT_INFO = [ODBCのデータソース名] -HS_FDS_TRACE_LEVEL = OFF **listener.oraの編集 [#g7d224dd] [%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) ) ) **リスナー起動 [#l1890132] Windows認証の場合は、以下の設定が必要になります。~ #Oracleのサービスがケルベライズされていないためベースクライアント認証は不可能。 -WindowsサービスからOracleのリスナーを停止し、~ ログイン・ユーザをSQL Serverに登録したユーザに変更する。 **tnsnames.oraの編集 [#je05ca58] [%ORCALE_HOME%\network\admin\tnsnames.ora]を編集します。 (hsodbcの追加) hsodbc = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)) (CONNECT_DATA = (SID=hsodbc)) (HS=OK) ) **データベースリンクの作成 [#e909e6ff] 下記SQLで「データベースリンク」を作成する。 CREATE DATABASE LINK DBLINK_SQLSRV USING 'HSODBC' / **データベースリンクのテスト [#eda93d2b] SQL Serverのテーブルにアクセスするためには、テーブル名の後ろに、~ アットーマーク(@)に続けてデータベースリンク名を指定します。 SELECT * FROM TBL_NAME@DBLINK_SQLSRV; Oracleからの分散トランザクションの動作は以下を参照。 -Oracle Technology Network (OTN) Japan~ - 掲示板 データベースリンクと分散トランザクション ...~ http://otn.oracle.co.jp/forum/thread.jspa?threadID=6004107 *参考情報 [#mb245680] -リンク サーバー (データベース エンジン)~ http://msdn.microsoft.com/ja-jp/library/ms188279.aspx -Oracleデータベースリンクメモ(Hishidama's Oracle DBlink Memo)~ http://www.ne.jp/asahi/hishidama/home/tech/oracle/dblink.html ---- Tags: [[:データアクセス]], [[:SQL Server]]