2016-11-17 46 views
0

我有一个Audit表来跟踪插入/更新操作。 我的问题是,在更新有2个案例。 1)定期更新 2)更新为从Isdeleted字段从false到true。mssql触发器 - 从INSERTED表中选择特定数据

我试图分开这两种情况,但我失去了一些东西,我是触发器的新手。

DECLARE @Action AS CHAR(1) 
DECLARE @Count AS INT 


SET @Action = 'I' 
SELECT @Count = COUNT(*) FROM DELETED 
if @Count > 0 
    BEGIN 
     SET @Action = 'D' 
     SELECT @Count = COUNT(*) FROM INSERTED WHERE INSERTED.IsDeleted = 0 
     IF @Count > 0 
      SET @Action = 'U' 
    END 

我想要做的就是去行动=“d”时改为请将isDeleted了(从假到真)的值。 当其他值被改变时'U'。

回答

1

根据您创建触发器的方式,您可以修改它以利用UPDATE()来简化设置值@Action的逻辑。

例如:

CREATE TRIGGER myTrigger ON myTable AFTER UPDATE, DELETE 
BEGIN 

    DECLARE @Action AS CHAR(1) 

    IF UPDATE(isDeleted) 
     SET @Action = 'U' 

END 

这将触发每次但只有SET@Action值时,有上isDeleted列,我认为这是你在找什么变化。

我不知道你会怎么做,但它会做你所需要的。

0

这个选择将返回请将isDeleted柱从0到1更新行数:

select count(*) 
from inserted inner join deleted on <fk_column(s)> 
where deleted.IsDeleted = 0 
and inserted.IsDeleted = 1 

然而,由于触发每个语句的工作(而不是每行),有可能的情况,其中一些行被删除,有些只是更新,所以保持行每行动可能会更棘手一点。

0

试试这个:


DECLARE @Action AS CHAR(1) 
DECLARE @Count AS INT 

IF NOT EXISTS(SELECT 1 FROM Deleted) 
BEGIN 
    SELECT 
     @Action = 'I' 
END 
ELSE 
BEGIN 

    SELECT 
    @Count = COUNT(1) 
    FROM Inserted Ins 
     INNER JOIN Deleted Del 
     ON Ins.SeqNo = Del.SeqNo 
     WHERE ISNULL(Ins.IsDeleted,0) <> ISNULL(Del.IsDeleted,0) 
      AND Ins.Column1 = Del.Column1 
      AND Ins.Column2 = Del.Column2 
      AND Ins.ColumnN = Del.ColumnN 

    SELECT 
    @Action = CASE WHEN ISNULL(@Count,0)>0 
       THEN 'D' 
       ELSE 'U' END 

END 

SELECT 
    [ActionCode] = @Action