「[[マイクロソフト系技術情報 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]]

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS