我有以下情况。 我有一个带插入触发器的表。 当我在其中插入一行时,我想从这个触发器中插入一些行到第二个表中。 对于这些行中的每一行,我想在它自己的事务中执行它,以防出现问题。 我想在第一个表中包含原始行,在第二个表中包含所有行(这些有严重错误)。
要重现的小代码:
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')。 我该如何为此编写代码?
答案 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