一个表写了一个insert的触发器,如果这个触发语句失败,是否影响插入数据?

解决方案 »

  1.   

    ...
    2楼理解错了吧以下帮助内容:当执行触发器时,触发器的操作总是好像有一个未完成的事务在起作用。如果激发触发器的语句是在隐性或显式事务中,则肯定会这样。在自动提交模式下,也是如此。当语句开始以自动提交模式执行时,如果遇到错误,则会有隐含的 BEGIN TRANSACTION 语句允许恢复该语句生成的所有修改。该隐含的事务对批处理中的其它语句没有影响,因为当语句完成时,该事务要么提交,要么回滚。但是,当调用触发器时,该隐含的事务将仍然有效。这意味着,只要触发器中发出 BEGIN TRANSACTION 语句,则实际上就开始了一个嵌套事务。因为当回滚嵌套事务时,嵌套的 BEGIN TRANSACTION 语句将被忽略,触发器中发出的 ROLLBACK TRANSACTION 总是回滚过去该触发器本身发出的所有 BEGIN TRANSACTION 语句。ROLLBACK 回滚到最外部的 BEGIN TRANSACTION。若要在触发器中进行部分回滚,则即使总是以自动提交模式进行调用,也必须使用 SAVE TRANSACTION 语句。以下的触发器阐明了这一点:CREATE TRIGGER TestTrig ON TestTab FOR UPDATE AS
    SAVE TRANSACTION MyName
    INSERT INTO TestAudit
       SELECT * FROM inserted
    IF (@@error <> 0)
    BEGIN
      ROLLBACK TRANSACTION MyName
    END这也影响触发器中 BEGIN TRANSACTION 语句后面的COMMIT TRANSACTION 语句。因为 BEGIN TRANSACTION 启动一个嵌套事务,而随后的 COMMIT 语句只应用于该嵌套事务。如果在 COMMIT 之后执行 ROLLBACK TRANSACTION 语句,那么 ROLLBACK 将一直回滚到最外部的 BEGIN TRANSACTION。以下的触发器阐明了这一点:CREATE TRIGGER TestTrig ON TestTab FOR UPDATE AS
    BEGIN TRANSACTION
    INSERT INTO TrigTarget
       SELECT * FROM inserted
    COMMIT TRANSACTION
    ROLLBACK TRANSACTION此触发器绝对不会在 TrigTarget 表中插入。BEGIN TRANSACTION 总是启动一个嵌套事务。COMMIT TRANSACTION 只提交嵌套事务,而下面的 ROLLBACK TRANSACTION 则一直回滚到最外部的 BEGIN TRANSACTION。
      

  2.   

    比如,当有一条记录insert时,触发器功能是update这个记录某个字段。
      

  3.   

    create table tt(id char(8))
    create table tb(id int)
    create trigger t on tt for insert
    as
    insert into tb(id)
    select id
    from insertedinsert into tt(id)
    select 'www'select * from tt
    select * from tb