--按你的触发器写法,结果没错啊create trigger tud on a for update as exec p_1 --调用存储过程,存储过程插入一条记录 insert a(code) --调用完存储过程后,回到触发器继续执行,这样就是一个update插入了两条记录 values('aaa')
--触发器问题! --测试数据如下 create table a(i int identity(1,1),code varchar(10)) go--创建触发器 create trigger tud on a for update as exec p_1 insert a(code) values('aaa') go--建储过程 create proc p_1 as alter table a disable trigger all insert a values('bbbb') alter table a enable trigger all go--建测试数据 insert into a select 'a'--问题是为何执行下面的语句时,插入了两条记录,trigger tud 好象执行了两次! update a set code = 'aa' where i = 1select * from a/* i code ----------- ---------- 1 aa 2 bbbb 3 aaa(所影响的行数为 3 行) */godrop table a drop proc p_1
请在最后执行时,不加go试试,即可执行下面的语句,会有5条记录,而不是3条,最后再go为3条.这是什么原因,会导致那个触发器执行两次 update a set code = 'aa' where i = 1select * from a
for update
as
exec p_1 --调用存储过程,存储过程插入一条记录
insert a(code) --调用完存储过程后,回到触发器继续执行,这样就是一个update插入了两条记录
values('aaa')
--测试数据如下
create table a(i int identity(1,1),code varchar(10))
go--创建触发器
create trigger tud on a
for update
as
exec p_1
insert a(code)
values('aaa')
go--建储过程
create proc p_1
as
alter table a disable trigger all
insert a
values('bbbb')
alter table a enable trigger all
go--建测试数据
insert into a select 'a'--问题是为何执行下面的语句时,插入了两条记录,trigger tud 好象执行了两次!
update a
set code = 'aa'
where i = 1select * from a/*
i code
----------- ----------
1 aa
2 bbbb
3 aaa(所影响的行数为 3 行)
*/godrop table a
drop proc p_1
update a
set code = 'aa'
where i = 1select * from a
'CREATE TRIGGER' 必须是批查询中的第一条语句。
服务器: 消息 111,级别 15,状态 1,行 13
'CREATE PROCEDURE' 必须是批查询中的第一条语句。