1

3 つのテーブル (_items、_invoiceHeader、_invoiceDetails) があるとしましょう。_invoiceDetails に更新トリガーを作成したので、_itemCode を更新すると、_items テーブルの _balance 列を更新できます。しかし、問題は、_items テーブルの _itemCode 列を更新すると、_items および _invoiceDetails テーブルの _itemCode 列に対するカスケード ルールにより、_invoiceDetails テーブルのトリガーがすぐに実行されることです。_invoiceDetails テーブルで発生した更新が、カスケードまたは同じテーブル _invoiceDetails の更新のために行われたことをどのように知ることができますか。

このコードを _invoiceDetails テーブルの更新トリガー内に配置します。

    if(UPDATE(itemCode)) // I need a condition here to prevent the implementation if the update happened because of cascade rule.
   BEGIN
       UPDATE items
           SET balance=balance+d.quantity
       FROM items
       INNER JOIN DELETED d
       ON items.accountsItemCode=d.accountsItemCode       

       UPDATE items
       SET balance=balance-i.quantity
       FROM items
       INNER JOIN INSERTED i
       ON items.itemCode=i.itemCode
  END
4

2 に答える 2

0

Trigger_NestLevelを使用して、他のトリガーがアクティブかどうかを判断 してみてください。

于 2012-07-15T21:48:13.957 に答える
0

テーブル設計基準の 1 つは、変更を追跡するテーブルにメタ列を含めることです。UPDATE ID/UPDATE TIMESTAMP やその他の場合は DATA SOURCE などがあります。

通常、プロシージャを呼び出しているユーザーの corp id を渡し、それをテーブルに挿入し、バッチ/トリガー/ユーザー以外のアクションがサービス アカウント名と共に挿入されます。

ここでそのようなパターンを適用すると、問題が解決します。

于 2012-07-15T18:21:33.783 に答える