トップページ | バックアップログの切捨て方法 »

2005年6月17日 (金)

別サーバー上のDBのテーブルを同時更新したい

トリガもリンクサーバーも初めてだった。テスト経過を書く。
Windows2003Server、SQL Server2000
リンクサーバーはWindowsNT、SQL Server7.0

1.リンクサーバーの追加
EXEC sp_addlinkedserver 'サーバー名', N'SQL Server'
EXEC sp_addlinkedsrvlogin 'サーバー名', 'false', NULL, 'User', 'Password'

2.リンクサーバー上のテーブルを更新してみる→OK

3.トリガを使って同一サーバー上で別DBのテーブルを更新してみる→OK

4.トリガを使ってリンクサーバー上のテーブルを更新してみる
下記エラー発生
サーバー : メッセージ 7391、レベル 16、状態 1、行 2
OLE DB プロバイダ 'SQLOLEDB' は分散トランザクションを開始できなかったので、要求した操作は実行されませんでした。[OLE/DB provider returned message: 指定されたトランザクション コーディネータに、新規トランザクションを参加できませんでした。]
<対応>
http://support.microsoft.com/kb/329332/JA
次に別の下記エラー発生
[OLE/DB provider returned message: このセッションでは、これ以上のトランザクションを開始できません。]
[OLE/DB provider returned message: このセッションでは、これ以上のトランザクションを開始できません。]
OLE DB エラー トレース [OLE/DB Provider 'SQLOLEDB' ITransactionLocal::StartTransaction returned 0x8004d013:  ISOLEVEL=4096]。
OLE DB プロバイダ 'SQLOLEDB' でネストしたトランザクションを開始できません。 XACT_ABORT オプションが OFF に設定されているので、ネストしたトランザクションが必要です。
スクリプト C:\work\MUCSDATA\Connection1\リンクサーバー接続テスト.sql の実行を完了しました。
<参考>
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/acdata/ac_8_md_06_8tf7.asp

SET XACT_ABORT  ON をクエリアナライザで実行してみる→ダメ
これはトランザクションの実行のように更新前にしないといけないらしい。

トリガーを起動するテーブルを更新する更新文の前にSET XACT_ABORT  ON を記述して
実行してみる。
SET XACT_ABORT ON
INSERT INTO オーダー ([品目コード],オーダー番号) VALUES ('TEST_HIN_CD','T0521_3')
→OK

でもいちいち更新文の前にSET XACT_ABORT ON を追加する修正はできないので
トリガー内にSET XACT_ABORT ON を入れてやってみる。

CREATE TRIGGER triOrderInsert ON [dbo].[オーダー]
FOR INSERT
AS

SET XACT_ABORT ON

INSERT INTO サーバー名.kaneko.dbo.orderf
(oroode,orodno)

SELECT [品目コード],[オーダー番号] from inserted
 
→OK

やりたいことが可能なことが分かった。
でもこの調査に二日かかったな。

トップページ | バックアップログの切捨て方法 »

SQLServer」カテゴリの記事

コメント

助かりました。
おかげで10分ほどで同様のケースに対応できました。

遅ればせながら・・・
お役に立って良かったです。

コメントを書く

(ウェブ上には掲載しません)

トラックバック


この記事へのトラックバック一覧です: 別サーバー上のDBのテーブルを同時更新したい:

トップページ | バックアップログの切捨て方法 »