2010-12-20 91 views
3

造成两排我使用SQL Server 2005,并有以下问题:SQL更新查询被触发

在一个table A,我有跟踪任何插入/更新/删除它触发。跟踪的记录被插入审计表(aAudit)。当我在A运行的更新,我看到在审核表中两行的每次更新,这不是我所期望的。这是我所定义的触发:

ALTER TRIGGER [ATrigger] ON [dbo].[A] 
FOR INSERT, UPDATE, DELETE 
AS 
INSERT INTO [dbo].[aAudit] 
([BusinessDate], [DataTypeId], [BookId], [Version], [DelFlag], [AuditDate], [ExtStatus]) 
SELECT [BusinessDate], [DataTypeId], [BookId], [Version], 'N', getDate(), 0 
FROM inserted 

INSERT INTO [dbo].[aAudit] 
([BusinessDate], [DataTypeId], [BookId], [Version], [DelFlag], [AuditDate], [ExtStatus]) 
SELECT [BusinessDate], [DataTypeId], [BookId], [Version], 'Y', getDate(), 0 
FROM deleted 

为什么产生一行与DelFlag = 'Y'和一行在审核表DelFalg = 'N'上述触发?

感谢您抽空看看我的问题。

维克拉姆

回答

4

为了分离三个操作INSERT,UPDATE,DELETE,你需要做其他检查:

ALTER TRIGGER [ATrigger] ON [dbo].[A] 
FOR INSERT, UPDATE, DELETE 
AS 
    -- those are true INSERTs - the (ID) as primary key is *not* present in the "Deleted" table 
    INSERT INTO [dbo].[aAudit]([BusinessDate], [DataTypeId], [BookId], [Version], [DelFlag], [AuditDate], [ExtStatus]) 
     SELECT [BusinessDate], [DataTypeId], [BookId], [Version], 'N', getDate(), 0 
     FROM inserted 
     WHERE (id) NOT IN (SELECT DISTINCT (id) FROM DELETED) 

    -- those are true DELETEs - the (ID) as primary key is *not* present in the "Inserted" table 
    INSERT INTO [dbo].[aAudit]([BusinessDate], [DataTypeId], [BookId], [Version], [DelFlag], [AuditDate], [ExtStatus]) 
     SELECT [BusinessDate], [DataTypeId], [BookId], [Version], 'Y', getDate(), 0 
     FROM deleted 
     WHERE (id) NOT IN (SELECT DISTINCT (id) FROM INSERTED) 

    -- those are the UPDATEs - the (ID) as primary key is present in both the "Inserted" and "Deleted" table 
    INSERT INTO [dbo].[aAudit]([BusinessDate], [DataTypeId], [BookId], [Version], [DelFlag], [AuditDate], [ExtStatus]) 
     SELECT [BusinessDate], [DataTypeId], [BookId], [Version], 'N', getDate(), 0 
     FROM Inserted i 
     INNER JOIN Deleted d on i.ID = d.ID 
+0

非常感谢响应,即解决我的问题:) – Vikram 2010-12-20 17:23:12

+0

@Vikram - 你应该接受(点击复选框)然后回答。这会鼓励人们协助你,并让其他搜索者知道哪个答案纠正了问题 – JNK 2010-12-20 18:19:56

6

在幕后,作为DELETE删除旧行,插入新行UPDATE处理。因此,当您执行更新时,INSERTED和DELETED记录集都包含数据。

这为什么是两个行进入您audit从表中UPDATE语句。

+0

+1现货 - 更新被视为一个INSERT/DELETE组合操作 – 2010-12-20 17:17:30

+0

如果是这种情况,是否是一种处理它的方法?我想要任何插入/更新作为“未删除”进入审计表,并将任何已删除的行作为“已删除”。 – Vikram 2010-12-20 17:18:57

+0

@Vikram:是的,你可以做到这一点 - 你只需要在你的触发更多的检查 - 看我为细节 – 2010-12-20 17:20:58