【问题标题】:How to get the action performed in trigger如何获取触发器中执行的操作
【发布时间】:2017-09-01 09:47:57
【问题描述】:

我想在这个问题中实现的是,如果我在我的表的 1 中进行了任何更新/删除/插入,它应该将该记录插入到表的 1 中以用于日志目的

我有 1 个表作为测试。假设如果我在我的表测试中插入下面的行,它应该触发一个触发器并在我的另一个表中插入一行,即日志

测试

Id  |   Name    |   Location        
1   |   Test    |   America 

日志

ID  |   updatetime              |   Action      
----------------------------------------------------------      
1   |   2017-04-06 16:51:18.190 |   Insert  

如果我删除或更新任何正在操作的东西,它应该分别删除或更新

ID  |   updatetime              |   Action      
----------------------------------------------------------      
1   |   2017-04-06 16:51:18.190 |   Insert  
1   |   2017-04-06 16:51:18.190 |   Delete  

我创建了一个触发器

create trigger abc 
on test
after insert, update, delete
as
begin
    declare @id int

    select @id = i.id from inserted i

    insert into log values (@id, GETDATE())
end

从上面的触发器我可以得到 ID 和 updatetime,但是如何获取 action 列,比如执行了什么操作如何实现。谁能给点线索

【问题讨论】:

  • 您的触发器有 MAJOR 缺陷,因为您似乎认为它会每行调用一次 - 那是不是 b> 情况。触发器将每条语句触发一次,因此如果您的语句影响 25 行,您将触发触发器一次,然后Inserted 和/或Deleted每个伪表将包含 25 行。您的代码将在这 25 行中选择哪一行? SELECT @id = i.id FROM Inserted i - 这是不确定的。您需要重写触发器以考虑到这一点!
  • @Red Devil 对哪个 MySQL 版本有效,因为我只收到“插入后更新删除”语句的语法错误。

标签: sql sql-server triggers sql-server-2012


【解决方案1】:

您可以创建下一个方法来确定发生的操作:-

DECLARE @Action as char(1);
    SET @Action = (CASE WHEN EXISTS(SELECT * FROM INSERTED)
                         AND EXISTS(SELECT * FROM DELETED)
                        THEN 'U'  -- Set Action to Updated.
                        WHEN EXISTS(SELECT * FROM INSERTED)
                        THEN 'I'  -- Set Action to Insert.
                        WHEN EXISTS(SELECT * FROM DELETED)
                        THEN 'D'  -- Set Action to Deleted.
                    END)

-- For Getting the ID
if  @Action = 'D'
select @id=i.id from DELETED i
else -- Insert or Update
select @id=i.id from INSERTED i

【讨论】:

  • 嗨,艾哈迈德,您的代码非常好,但我有 1 个问题,当我在测试表上运行删除查询时,在我的日志中创建了表条目,但在 ID 列中显示为 NULL
  • @RedDevil,因为您正在选择表单 inserted ,所以请从 deleted 中选择。
  • 但是,如果我尝试插入或更新,那么它会以 NULL 的形式出现
  • 所以同时使用(inserted & deleted),我的答案已更新。
  • 这太棒了,它的工作方式就像我想要的那样thanx alot @Ahmed
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-16
  • 1970-01-01
  • 1970-01-01
  • 2013-01-06
  • 2012-11-25
  • 2013-04-11
  • 1970-01-01
相关资源
最近更新 更多