SQL Server:事务

时间:2016-09-29 07:34:35

标签: sql-server triggers transactions

我在表上更新后有一个触发器,一个事务中有2个更新。第一次更新后调用了触发器。我希望,在整个事务之后触发视图更新,但事实并非如此:

我的交易:

  1. 更新表
  2. 调用触发器,触发器仅参见1
  3. 的更新
  4. 更新表
  5. 没有通话触发器,因为3中的更新条件不匹配
  6. 可以设置触发器,然后在事务后触发查看数据(从1到3)?

    我的触发器:

    ALTER TRIGGER "dbo"."TRIGGER" 
    ON TABLE
    FOR UPDATE
    AS
        IF (SELECT COUNT(*) FROM inserted i, deleted d
            WHERE d.aaa IS NULL 
              AND i.aaa IS NOT NULL 
              AND i.bbb IN ('0', '1', '6', '9')) > 0
        BEGIN
            INSERT INTO export (aaa, ccc) 
                (SELECT aaa, ccc FROM inserted)
        END
    

    初始数据:insert into TABLE(aaa,bbb,ccc) values(123,'N',100)

    更新

    update TABLE set bbb = '0' where aaa = 123
    update TABLE set ccc = 1 where aaa = 123
    

    期待:insert into export(123,1)

    但它调用:insert into export(123,100)

1 个答案:

答案 0 :(得分:1)

我看到了你的问题。

但是,SQL Server中的触发器是语句级别的,不幸的是它们不像您期望的那样工作。您可以通过向表中添加一些“控制”列(在事务的最后更新它并在其周围创建一些逻辑)或使用context_info来使其工作,但它确实闻到了恕我直言。

远离触发器并从主示波器插入导出表,这是您的最佳选择。