2016-08-01 16 views
0

私はトリガを使用して、同期して単一のデータベースに2つの同一のテーブルを保持しています。 1つは内部プロプライエタリシステム用で、もう1つはデータのサブセットを外部に公開するために使用されます。私は両方のために同じテーブルを使用することはできません。SQL Server 2テーブル同期の再帰

どちらのテーブルにも更新、挿入、削除が必要です。

これまで、私は即時更新を望んでいたので、スケジュールされたストアドプロシージャの代わりに両方のテーブルでトリガを使用しています。問題は、テーブルAへの更新がテーブルBを更新するトリガを起動し、テーブルBを更新するトリガを起動し、トリガをテーブルBに起動するということです。

再帰を止めるにはどうすればよいですか?

一つの方法は、このようなもの、それは異なっているかどうかを確認するために最初のデータをチェックすることです:

 SELECT @cempno = inserted.cempno FROM inserted 

     SELECT @count = COUNT(*) 
      FROM jcempy j INNER JOIN zhhjcempy z ON j.cempno = z.cempno AND j.cempno = @cempno 
      WHERE (j.ccostcode <> z.ccostcode) 
      OR (j.cimearnreg <> z.cimearnreg) 
      OR (j.cimearnot <> z.cimearnot) 
      OR (j.cimearndt <> z.cimearndt) 
      OR (j.cimearnl1 <> z.cimearnl1) 

     IF @count = 1 
     BEGIN 
      -- Update the record 
     END 

もう一つの方法は、最初に開始したテーブルを示すためにステータスフラグを保持している第三のテーブルを使用することができ私は100人のユーザーがシステムにぶち打ちを受けたら、それは問題になると感じている。

データチェックにどのようなパフォーマンス上の違反が生じるかについてのご意見やご意見はありますか?

ありがとうございます!

+0

テーブルを実際には[更新可能なビュー](https://msdn.microsoft.com/en-nz/library/ms187956.aspx#Anchor_3)にすることはできますか? – Blorgbeard

+0

@Blorgbeard残念ながら、ここにはサードパーティのツールが関わっています。興味深い考えですが、私はそれを考えませんでした。 – NelsonH

+0

トリガーを使用しない再設計が必要です。 「1つの時計を持っている人は、何時になったのか分かっています.2人の人は決して確実ではありません」という古い言葉があります。 – JVC

答えて

0

トリガーを避けることができない場合は、トリガー内で@@NESTLEVELをご覧ください。

常に同じ番号である必要があります。数字が大きい場合は何もしないでください。

+0

これはうまくいくかもしれませんが、@ @ NESTLEVELの値はどのようにするべきですか?私はテストで一貫性のあるものを得ています - これはいつも同じでしょうか?答えをありがとう! – NelsonH

+0

直接更新/削除/挿入を行う場合は、「1」にする必要があります。これらのアップデートにaを使用する場合は、手続きと直接アップデートの組み合わせが異なる場合があります。ビューやシノニムを使用してトリガーを除去し、すべてのデータを1つの表に入れるほうがよい。 –

+0

の値は実際には3でした。私はTRIGGER_NESTLEVEL()を使用して、それを反対のトリガのオブジェクトIDを見て動作させました。私はコメントがトリガーを使用していないことを理解していますが、再設計のオプションはありません。私のベンダーや同義語/更新可能なビューから戻ってきたことは絶対にうまくいかないでしょう。テーブルでなければならない。応答いただきありがとうございました。 – NelsonH