- PR -

トランザクション開始中にSQLServerのリンクサーバにアクセスするとエラー7391が発生

投稿者投稿内容
Hoppy
常連さん
会議室デビュー日: 2005/05/30
投稿数: 29
投稿日時: 2006-01-10 21:46
いつもお世話になってます。

SQLServerのリンクサーバにより別サーバのORACLEに対しアクセスを行っています。
しかし、トランザクションを明示的に開始している最中にリンクサーバへ
アクセス(SELECT文等を実行)すると以下のエラーが発生します。

"OLE DB プロバイダ 'MSDAORA' は分散トランザクションを開始できなかったので、要求した操作は実行されませんでした。
OLE DB エラー トレース [OLE/DB Provider 'MSDAORA' ITransactionJoin::JoinTransaction returned 0x8004d01b]。"

他の掲示板の過去ログに同じ内容の投稿がいくつかありましたが、
改めて質問させていただきます。

分散トランザクション関係が関連していると思い、以下のサイトを参考にして
設定を行ってみたのですが状況は変わりませんでした。
 http://support.microsoft.com/kb/817064
 http://support.microsoft.com/kb/329332
 http://support.microsoft.com/kb/827805
 http://support.microsoft.com/kb/839279

環境
 OS:Windows2003Server EntEd SP1
 DB:SQLServer2000 EntEd SP4 (ORACLEのバージョンは9i)

よろしくお願いいたします。
Anthyhime
ぬし
会議室デビュー日: 2002/09/10
投稿数: 437
投稿日時: 2006-01-11 09:25
1.DTCが開始されていない
2.MtxOCI.dllが読み込まれていない。
3.トランザクションをネスとしている。
のいずれかの様です。

http://frog.raindrop.jp/knowledge/archives/000108.html

Hoppy
常連さん
会議室デビュー日: 2005/05/30
投稿数: 29
投稿日時: 2006-01-11 11:40
Anthyhimeさま返信ありがとうございます。

引用:

Anthyhimeさんの書き込み (2006-01-11 09:25) より:
1.DTCが開始されていない
2.MtxOCI.dllが読み込まれていない。
3.トランザクションをネスとしている。



1.DTCは開始されていました。
2.レジストリの値が異なっていたので変更しました。
3.トランザクションのネストは行っていません。

ご教授頂いたサイトの内容と合わせて確認してみましたが現象は変わりませんでした。
リンクサーバにて使用しているプロバイダは「Microsoft OLE DB Provider for Oracle」です、Books Onlineかネットかで当プロバイダは分散トランザクションを
サポートしていると載っていたような覚えがあるのですが、間違いないでしょうか?

度々の質問で申し訳ありません。
Anthyhime
ぬし
会議室デビュー日: 2002/09/10
投稿数: 437
投稿日時: 2006-01-11 12:34
ここらあたりで解消しますかね。
http://support.microsoft.com/default.aspx?scid=kb;ja;280106
Hoppy
常連さん
会議室デビュー日: 2005/05/30
投稿数: 29
投稿日時: 2006-01-11 14:52
SQLServerをインストールしてあるサーバの
「HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSDTC\MTxOCI」配下の
各レジストリ値は以下としてあります。

 OracleXaLib:oraclient9.dll
 OracleSqlLib:orasql9.dll
 OracleOciLib:oci.dll

レジストリ値が正しくないためにMtxOCI.dllが読み込まれず、
分散トランザクションが実行されていないということなのでしょうか?
その後も調査してみたのですが、レジストリ値は上記の設定で
良さそうな感じなのですが・・・

ちなみに変更前のレジストリ値は以下でした
 OracleXaLib:xa80.dll
 OracleSqlLib:sqllib80.dll
 OracleOciLib:oci.dll
Hoppy
常連さん
会議室デビュー日: 2005/05/30
投稿数: 29
投稿日時: 2006-01-11 16:43
自己レスです。

コンポーネントサービスにおいて、MSDTCの「セキュリティの構成」により
「DTC ログオン アカウント」を"NT Authority\NetworkService"から
Administrators権限をもつローカルアカウントに変更したところ
エラーが発生せずに実行できるようになりました。
(分散トランザクションが開始できるようになった!?)

しかし、以下のサイトに記述されているようにMSDTCサービスのログオンアカウントは
"ネットワークサービス"とする必要があるようです。

http://support.microsoft.com/kb/839279

この対応で本当に良いものなのでしょうか・・・
Hoppy
常連さん
会議室デビュー日: 2005/05/30
投稿数: 29
投稿日時: 2006-01-12 10:26
うまく行ったように思えたのですが、サーバを再起動したところイベントログにて
以下のエラーが発生し、DTCサービスが起動できないために同様のエラーが発生する
ようになってしまいました。

MS DTC サービスを実行しているアカウントが無効です。 これは、サービスのアカウント情報が Microsoft 管理コンソール (MMC) のサービス スナップインを使用して変更された場合に起こります。 MS DTC サービスは開始作業を続行します。MS DTC サービスのアカウント情報が、コンポーネント サービス エクスプローラを使用して更新されていることを確認してください。

アカウント情報はコンポーネントサービスエクスプローラを使用して変更したの
ですが、そもそもサービスに対するログオンは特定のローカルアカウントにする
ことがまずかったのでしょうか?

結局、DTCサービスの再インストールを行い、再度設定をしてみたのですが
当初の問題は解決できず、振り出しに戻ってしまいました。
Hoppy
常連さん
会議室デビュー日: 2005/05/30
投稿数: 29
投稿日時: 2006-01-12 14:01
問題は未だ解決しておりませんが、今までに対応を行った内容をまとめます。
(下記手順はMSDTCサービスをアンインストールした後からとなります)

1.MSDTCサービスのインストール
 support.microsoft.com/kb/839279
2.コンポーネントサービスよりMSDTCのセキュリティ構成の設定
 ・「ネットワークDTCサービス」をチェック
 ・「受信を許可する」、「送信を許可する」をチェック
 ・「トランザクションマネージャ通信」の「認証を必要としない」を選択
 support.microsoft.com/kb/839279
3.ネットワークDTCアクセスの有効化
 support.microsoft.com/kb/817064
4.レジストリの変更
 [HKEY_LOCAL_MACHINE/SOFTWARE/icrosoft/MSDTC]
  「TurnOffRpcSecurity」を追加(設定値=1)
   support.microsoft.com/kb/827805
 [HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/MSDTC/MTxOCI]
  ・OracleOciLib:oci.dll
  ・OracleSqlLib:orasql9.dll
  ・OracleXaLib:oraclient9.dll

以上の設定を行い、クエリアナライザ等より以下のSQLを実行する
コード:

 BEGIN TRANSACTON
 SELECT * FROM LinkServerName..Username.TableName
 COMMIT TRANSACTION

すると最初に投稿した内容と同様のエラー(分散トランザクションが開始できない...)が発生。

いろいろ調査した結果、一通り設定を行なってみたつもりですがそれでも解決できず、お手上げ状態となっています。
ご存知のかたおりましたらご教授願います。
よろしくお願いいたします。

スキルアップ/キャリアアップ(JOB@IT)