【问题标题】:cursor within trigger for multiple update多次更新触发器内的游标
【发布时间】:2014-09-24 16:13:31
【问题描述】:

我有一个触发器,它注册了我在表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

【问题讨论】:

    标签: sql-server triggers cursor


    【解决方案1】:

    这里不需要光标,只需按以下方式操作即可

    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
    

    【讨论】:

    • 虚拟故事包含记录操作所需的数据。在更新的情况下:插入 - 删除新值 - 旧值
    • @M.Ali 没有游标对我不起作用,为什么更新会连续影响许多更新并且没有游标的触发器还没有准备好保存每个输入并移动到下一个,会失败用光标循环
    • @user_012314112 你测试过吗?我可以向您保证,它会起作用,并且比任何涉及光标的解决方案都要高效。
    • @M.Ali 是的,它可以工作,谢谢大家,但我个人想知道如何用光标来做到这一点。
    • 任何可以在没有游标的情况下完成的事情,如果您使用的是 sql server 2005 或更高版本,那么几乎是所有事情,您应该远离游标。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-09
    • 2020-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多