- 追加された行はこの色です。
- 削除された行はこの色です。
Open棟梁Project - マイクロソフト系技術情報 Wiki
「[[マイクロソフト系技術情報 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文のみ実行する場合
-トランザクションを使わない場合(都度コミット)
>をトランザクション開始直後に発行すると~
グローバルトランザクションが実行可能となる。~
-以下の場合は、上記を発行する必要はない。
--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]
*他のDBMSからSQL Serverにリンク [#s3acd056]
OracleやHiRDBなどを起点とする場合、~
そちらの製品の機能を使用することになる。
調べると、前提条件が、
-OLEDBではなくてODBC接続。
-分散トランザクションも必要。
など、製品によって前提条件が異なるようです。
**Oracleからデータベースリンク接続 [#xc395092]
以下の手順で設定可能(Oracle10g → SQL Server 2005の事例)
**前提条件 [#cfacd8f8]
Generic Connectivity Common Files 10.2.0.1.0 がインストールされていること
***前提条件 [#cfacd8f8]
Generic Connectivity Common Files 10.2.0.1.0 がインストールされていること。
**ODBCの設定 [#u0c16471]
(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]を編集します。
***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]を編集します。
***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認証の場合は、以下の設定が必要になります。~
***リスナー起動 [#l1890132]
Windows認証の場合は、以下の設定が必要になる。~
#Oracleのサービスがケルベライズされていないためベースクライアント認証は不可能。
-WindowsサービスからOracleのリスナーを停止し、~
ログイン・ユーザをSQL Serverに登録したユーザに変更する。
**tnsnames.oraの編集 [#je05ca58]
[%ORCALE_HOME%\network\admin\tnsnames.ora]を編集します。
***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]
***データベースリンクの作成 [#e909e6ff]
下記SQLで「データベースリンク」を作成する。
CREATE DATABASE LINK DBLINK_SQLSRV
USING 'HSODBC'
/
**データベースリンクのテスト [#eda93d2b]
***データベースリンクのテスト [#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]]