2017-04-06 103 views
0

我想在这个问题上实现的是,如果我在我的表格中进行了任何更新/删除/插入操作,它应该将该记录插入表格中的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和录入,可是如何才能让行动柱像已执行什么动作如何实现这一点。任何人都可以有一个线索

+0

你触发了** **主要中的缺陷,你似乎认为它会被称为**每行一次** - 这是**不是**的情况。触发器将在每个语句**中触发一次**,因此如果您的语句影响25行,您将触发**触发**一次,但是随后插入的和/或删除的伪表格将分别包含25个行。您的代码在这25行中选择哪一个? 'SELECT @id = i.id FROM Inserted i' - 这是非确定性的。你需要重写你的触发器来考虑这个问题! –

回答

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 
+0

嗨艾哈迈德你的代码是优秀的,但我有1个问题,当我在测试表上运行删除查询时,在我的日志表中创建条目,但在ID列中显示为NULL –

+0

@RedDevil,因为您正在选择表单'插入',请从'deleted'中选择。 –

+0

但是,如果我尝试插入或更新,然后其作为NULL –