2010-12-20 88 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