【问题标题】:Fire trigger on updates (excluding certain fields change)更新时触发触发(不包括某些字段更改)
【发布时间】:2013-07-05 19:40:06
【问题描述】:

我已经这样定义了我的触发器:

CREATE TRIGGER [dbo].[trtablename]
    ON [dbo].[tablename]
    AFTER UPDATE
    AS update tablename set row_version = row_version + 1 
       where id in (select id from inserted)

有一个名为Row_Status 的字段。应该在不增加row_version 字段的情况下对其进行修改。如何在触发器中做出这样的条件?

【问题讨论】:

  • 手动修改和使用触发器是完全相反的。
  • 我的意思是修改字段不应该导致row_version改变。

标签: sql sql-server


【解决方案1】:

您需要基于UPDATE()函数添加一个可以在触发器中调用的条件。

类似:

CREATE TRIGGER [dbo].[trtablename] ON [dbo].[tablename]
AFTER UPDATE
AS

If not update(Row_Status)
begin

  update tablename set row_version = row_version + 1 
  where id in (select id from inserted)

end

根据您的表/列和可能发生的UPDATE 操作,您可能不得不增加检查的复杂性,但希望这会为您指明正确的方向。

【讨论】:

  • 也许结合COLUMNS_UPDATED() 函数来检查Row_status 是否只更新了列或其他一些也更新了msdn.microsoft.com/en-us/library/ms186329.aspx
  • @NenadZivkovic,谢谢,这是一个很好的建议。取决于表的复杂性,这可以使事情变得更容易。
  • @brick 只要更新查询不是手工制作的,就有可能更新记录中所有未计算的列(即 ORM、MS Access、Ado.Net 生成的更新针对所有列)。在这种情况下,Row_status 将被视为已更新,即使应用程序未触及它。如果这是您的情况,您可以在 idrow_status 上加入 inserteddeleted,因此只有在两个表中的状态没有不同时才允许更改 row_version。
【解决方案2】:

使用UPDATE 函数的唯一缺点是,即使在更新语句中提到了该字段,它也是正确的。即使它被设置为自身。

CREATE TRIGGER [dbo].[trtablename]
ON [dbo].[tablename]
AFTER UPDATE
AS
IF NOT UPDATE (Row_Status) 
    update tablename set row_version = row_version + 1 
       where id in (select id from inserted)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多