如何在触发器中执行操作

时间:2017-04-06 11:29:16

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

我想在这个问题中实现的是,如果我在表格中的任何一个中进行了任何更新/删除/插入,它应该将该记录插入表中的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和更新时间,但是如何获取动作列,就像执行了什么动作一样。任何人都可以有线索

1 个答案:

答案 0 :(得分:2)

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

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