代码之家  ›  专栏  ›  技术社区  ›  BuschnicK

TSQL更新触发器:加入插入和删除

  •  2
  • BuschnicK  · 技术社区  · 16 年前

    T-SQL提供了一个“if update(columnName)”构造。但是,如果许多行已更新,并且其中只有一行更改了特定列的值,“if update()”将必须返回true。这将使我对远远超过所需的行执行触发器操作。

    因此,我不想使用“if update()”,而是直接连接虚拟删除表和插入表(更新前后的行),并亲自比较相关列。但是,如何连接这两个表?我无法使用表的主键,因为它可能已被更新修改。我唯一能想到的是通过row_number()进行连接,即隐式表排序。但这感觉非常错误,我不知道SQL Server是否真的提供了任何保证,即inserted中的行顺序与deleted中的行顺序相同。

    5 回复  |  直到 16 年前
        1
  •  3
  •   Quassnoi    16 年前

    比如说,你有这张桌子:

    id   value
    1    2
    2    1
    

    并发出此操作:

    UPDATE  mytable
    SET     id = CASE WHEN id = 1 THEN 2 ELSE 1 END,
            value = CASE WHEN value = 1 THEN 2 ELSE 1 END
    

    它更新了两条记录,但将表保留为:

    id   value
    2    1
    1    2
    

        2
  •  0
  •   devio    16 年前

    如果使用标识列作为主键,则不会出现更新PK列的问题。

        3
  •  0
  •   KM.    16 年前

    IF (UPDATE(yourPKcol1) OR UPDATE(yourPKcol2))
    BEGIN 
        RAISERROR('Primary Key change not permitted!',16,1) 
        ROLLBACK
        RETURN
    END
    
        4
  •  0
  •   mwigdahl    16 年前

    所有这些都假设视图在您的特定情况下能够充分工作——如果应用程序正在做一些非常奇怪的事情,它可能无法正常工作,但是如果它只是抛出标准的CRUD样式的SQL,那么它应该可以正常工作。

        5
  •  0
  •   Moayad    13 年前

    你的权衡是简单&简单;可维护性与性能 如果性能没有优先级,则直接使用if更新(YourTriggerActionColumn) 如果对性能进行了优先级排序,那么方法是使用“if update(PrimaryKeyColumn)”,如果主键没有更改,则使用inserted deleted join else,如果主键更改,则选中“if update(YourTriggerActionColumn)” 由于PKs不经常更改,因此大多数情况下将使用插入的删除联接方法,从而解决性能问题。 有点晚了,但只有我的2美分:)