1

假设我有 3 个表(_items、_invoiceHeader、_invoiceDetails)我在 _invoiceDetails 上构建了一个更新触发器,因此如果我更新 _itemCode,我可以更新 _items 表中的 _balance 列。但问题是,如果我更新 _items 表中的 _itemCode 列,则 _invoiceDetails 表上的触发器会立即运行,因为 _items 和 _invoiceDetails 表中的 _itemCode 列上的级联规则。那么我怎么知道发生在 _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

我们的表格设计标准之一是在我们想要跟踪更改的表格中包含元列。我们有更新 ID/更新时间戳或其他时间数据源之类的东西。

通常,我们传递调用该​​过程的用户的 corp id 并将其插入到表中,同时使用一些服务帐户名称插入批处理/触发器/任何非用户操作。

在这里应用这样的模式将解决您的问题。

于 2012-07-15T18:21:33.783 回答
0

尝试使用Trigger_NestLevel以确定您的其他触发器是否处于活动状态。

于 2012-07-15T21:48:13.957 回答