在触发器中回滚嵌套事务

时间:2014-06-06 13:12:30

标签: triggers transactions sql-server-2012

我有以下情况。 我有一个带插入触发器的表。 当我在其中插入一行时,我想从这个触发器中插入一些行到第二个表中。 对于这些行中的每一行,我想在它自己的事务中执行它,以防出现问题。 我想在第一个表中包含原始行,在第二个表中包含所有行(这些有严重错误)。

要重现的小代码:

 create table test(id int primary key identity(1,1),name nvarchar(10))
    create table test2(id int primary key identity(1,1),
state char(1) check (state in ('a','b')))
    go

    create trigger test_trigger on test for insert
    as
    begin
    declare @char char(1)

    declare curs cursor for (
    select 'a'
    union
    select 'c'
    union
    select 'b')

    open curs

    fetch next from curs into @char

    while @@FETCH_STATUS = 0
    begin
        begin try
           begin transaction
              insert into test2(state)
              select @char
           commit
        end try
        begin catch
           print 'catch block'
           rollback 
        end catch
    fetch next from curs into @char
    end

    close curs
    deallocate curs

    end

    go

    insert into test(name) values('test')

    select * from test
    select * from test2
    go

    drop table test
    drop table test2

因此,对于此代码段中的示例数据,我希望在测试表中有一行“test”,在test2表中有两行('a'和'b')。 我该如何为此编写代码?

1 个答案:

答案 0 :(得分:1)

看起来我终于开始工作了。 更正了触发器代码:

create trigger test_trigger on test for insert
    as
    begin
    declare @char char(1)

    set xact_abort off

    declare curs cursor for (
    select 'a'
    union
    select 'c'
    union
    select 'b')

    open curs

    fetch next from curs into @char

    while @@FETCH_STATUS = 0
    begin
    save transaction t
        begin try

              insert into test2(state)
              select @char

        end try
        begin catch
           print 'catch block'
           rollback transaction t
        end catch
    fetch next from curs into @char
    end

    close curs
    deallocate curs

    end