「[[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。 -[[戻る>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(); *他のDBMSからSQL Serverにリンク [#s3acd056] OracleやHiRDBなどを起点とする場合、~ そちらの製品の機能を使用することになる。 調べると、前提条件が、 -OLEDBではなくてODBC接続。 -分散トランザクションも必要。 など、製品によって前提条件が異なるようです。 **Oracleからデータベースリンク接続 [#xc395092] 以下の手順で設定可能(Oracle10g → SQL Server 2005の事例) ***前提条件 [#cfacd8f8] Generic Connectivity Common Files 10.2.0.1.0 がインストールされていること。 (Generic Connectivity は、 -異機種間サービス ODBC エージェントまたは -異機種間サービス OLEDB エージェント として実装されます。 ) ***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] *参考 [#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 **Oracle [#z46d5215] -CREATEDATABASELINK~ https://docs.oracle.com/cd/E16338_01/server.112/b56299/statements_5005.htm -異機種間サービス・コンポーネントの役割~ https://docs.oracle.com/cd/E57425_01/121/HETER/tgvsgc.htm **HiRDB [#fba9daa5] -HiRDBからODBCドライバを使用してSQL Serverへデータ連動する場合のソフトウェア構成~ http://itdoc.hitachi.co.jp/manuals/3020/3020636150/W3610014.HTM ---- Tags: [[:データアクセス]], [[:SQL Server]]