私はテーブルを持っています[MYTABLE]、と挿入、更新トリガーです。他のコードを呼び出す前にT-SQLトリガーの効果を変更
トリガーは、[MYTABLE]の変更に基づいていくつかの作業を実行するストアドプロシージャを実行する必要があります。ストアドプロシージャのコードをトリガに移動することはできません。トリガーは変更が行われた後を実行するので
はこれまでのところ、とても良い...、ストアドプロシージャは[挿入]または[削除]メタテーブルにアクセスする必要がありません。
しかし...トリガがつの追加フィールド([LastModifiedの】 SMALLDATETIME)を変更する必要があるので、ストアドプロシージャは、その処理中にそのデータを使用することができます。これはではなくであるため、ストアドプロシージャは挿入/更新されたものを見ることができます。プロシージャは、それをトリガする更新に含まれていない他のレコードに基づいていくつかの処理を行います。かつてので - 私のトリガーは、(私は再帰的トリガーがオフになっている場合)、またはそれが二回ストアドプロシージャを呼び出すことになりますすべてので何もしませんどちらか[LastModifiedの]を、変更した場合
問題は、あります私の変更のために再び[LastModified]に変更されました。 (a)は[LastModifiedの]は、各変更で更新されますと、(b)ストアドプロシージャのみ後に呼び出され、私はこれを回避することができますので、それはは[LastModifiedの] の新しい値へのアクセスを持っているどのように
?
私は考えている2つのアイデアがありますが、彼らは面白いにおいがするので、より簡単な解決策があるかどうかを知りたいと思います。
編集:
1. 2つのトリガー:
[OK]を、ここで私はこれまでのところ、多分議論をするのに役立ちますしている溶液です。 "INSTEAD OF"トリガーはユーザーのレコードの更新を処理し、LastModifiedを変更しますが、更新がから SP(変更された列に基づいて判断できます)になるとすぐに戻ります。もう1つはEXECを呼び出す "AFTER"トリガーです。このトリガーは、LastModified列が既にに適用された更新をINSTEAD OFトリガーで取得します。少なくとも私はそれがどのように機能するのかと期待しています。
2. ModifiedDateを別のテーブルに移動します。このようにして、ユーザーがINSERT/UPDATEを開始し、監査レコードを別のテーブルに追加してSPを呼び出す場合、のみのAFTER INSERT/UPDATEトリガーを1つ作成できます。 SPは他のレコードを変更し、トリガを再び発動させるが、それ以上の作業をせずにすぐに状況を認識して戻ります。
最初の解決策の欠点は、トリガで列リストを維持する必要があるため、INSTEAD OF更新が実際に作業を意図しているためです(リストに列を追加したのでINSERT INTO tbl FROMを挿入すると、列を指定する必要があります)。
最初のINSERT/UPDATEはどのように実行されますか?そしてあなたはトリガを使用する必要がありますか?私が尋ねる理由は、イベントの全過程が(トリガを必要とせずに)ストアドプロシージャ内にカプセル化できるということです。 –