光标在触发器内进行多次更新

时间:2014-09-24 16:13:32

标签: sql-server triggers cursor

我有一个触发器,用于注册我在表tab中执行的更新,并将新旧值放在名为history的表中。但是此触发器仅对简单更新有用,例如

    UPDATE tab 
    set col1='value' 
    where id_tab=1 

由于只有一个寄存器在id_tab中取值1。但是,如果我想要执行像

这样的更新
   UPDATE tab 
   set col1='value'
   where col2=10

假设col2有几个值为10的注册表,那么我就无法在历史表中执行注册。 我可以在触发器中添加什么?我试图放置游标,但我不太确定如何处理游标

Create table Tab 
(id_tab smallint,
col1 varchar(5),
col2 varchar(5),
)

Create table History 
(id_modify       char(3),
old_data             int,
new_data             int,
)


Create trigger tr_update
on tab
after update
as
declare curs1 scroll cursor for select col2 from tab
open curs1 
insert into History (id_modify,old_data,new_data)
select i.id_tab, d.col1, i.col1
from inserted i
inner join deleted d on i.id_tab = d.id_tab
fetch next from curso1

1 个答案:

答案 0 :(得分:0)

这里不需要光标,只需按照以下步骤操作

CREATE TRIGGER tr_update
ON tab
AFTER UPDATE
AS
BEGIN
  SET NOCOUNT ON;

    INSERT INTO  History (id_modify,old_data,new_data)
    SELECT i.id_tab, d.col1, i.col1
    FROM inserted i
    INNER JOIN deleted d ON i.id_tab = d.id_tab

END