表A
ID Name
1 a
2 b
3 c表B
ID ChangeID在A中写触发器,当Name值改变的时候,把表A中对应的ID值存入表B的ChangeID字段
(最基本的触发器操作)问题:
如果在批量更新的时候该怎么处理?
1、如果不使用游标能否做到?
2、如果使用游标,最简单的写法是什么?谢谢大家
ID Name
1 a
2 b
3 c表B
ID ChangeID在A中写触发器,当Name值改变的时候,把表A中对应的ID值存入表B的ChangeID字段
(最基本的触发器操作)问题:
如果在批量更新的时候该怎么处理?
1、如果不使用游标能否做到?
2、如果使用游标,最简单的写法是什么?谢谢大家
ID Name
1 a
2 b
3 c表B
ID ChangeID
把表A中对应的ID值存入表B的ChangeID字段?没看明白?
create trigger mytrigger for INSERT, UPDATE ont A
as
insert into b select * from a
as update
if update(Name)
insert into tableB(ChangeID) select ID from deleted
GO
我的触发器也是这样写的问题是,在批量更新tableA中的Name字段时,只能取得最后一条记录,插入到tableB中因为触发器好像是在表更新完成之后才执行的
而deleted表中只有一条记录(批操作中最后一条执行的记录)因此在批操作的时候我往往只能获取一条
------------------------------------------------------批量更新時,deleted表中應該不止一筆記錄才對,你批量更新的語句貼出來看看
drop table tbTestA
if object_id('tbTestB') is not null
drop table tbTestB
GO
----创建测试数据
create table tbTestA(ID int,Name varchar(10))
create table tbTestB(ChangeID int)
GO
----创建更新触发器
create trigger trg_update_tbTestA on tbTestA
for update
as
if update(Name)
insert into tbTestB(ChangeID) select ID from deleted
GO
----插入测试数据
insert into tbTestA
select 1,'a' union all
select 2,'b' union all
select 3,'c' union all
select 4,'d' union all
select 5,'e' ----更新
update tbTestA set Name = Name + '_xyz' where ID > 3
GO----查看更新结果
select * from tbTestA
----查看更新触发器生成的结果
select * from tbTestB----清除测试环境
drop table tbTestA,tbTestB/*结果
1.更新结果
ID Name
----------- ----------
1 a
2 b
3 c
4 d_xyz
5 e_xyz2.更新触发器结果
ChangeID
-----------
4
5
*/
就是有一些符合条件的ID没有捕捉到,例如您的例子中提到的ID=5的记录(只是偶尔),所以我才怀疑是不是因为批量更新,所以触发器会出问题我在网上找了一些相关资料,好像也有人说过触发器中批量更新的问题