【发布时间】:2019-09-11 06:14:27
【问题描述】:
我创建了一个触发器来捕获副本表中的所有插入、更新和删除操作,但在更新的情况下,插入两行,其中一个具有更新前的值,另一行具有更新后的值,但它不能作为预计。
我已经尝试了所有可能的方法来做到这一点。现在,我想知道是否应该在触发级别使用事务进行更新操作,还是应该尝试其他方法。
ALTER TRIGGER [dbo].[trgAfterInsertUpdateDelete_xyz] ON [dbo].[xyz]
FOR UPDATE,INSERT, DELETE
AS
declare @accountID int;
declare @billingDate date;
declare @amount decimal(18, 2);
---- Get data from inserted/ updated
select @accountID = i.AccountID from inserted i;
select @billingDate=i.BillingDate from inserted i;
select @amount=i.Amount from inserted i;
-- Insert Case
IF EXISTS( SELECT * FROM inserted) AND NOT EXISTS(SELECT * FROM deleted)
BEGIN
insert into xyz_Audit
(AccountID, BillingDate, Amount, Audit_Action)
values(@accountID,@billingDate,@amount,'INSERT');
END
-- Update Case
IF EXISTS( SELECT * FROM inserted) AND EXISTS(SELECT * FROM deleted)
BEGIN
INSERT INTO xyz_Audit
(AccountID, BillingDate, Amount, Audit_Action)
SELECT d.AccountID, d.BillingDate, d.Amount,
'BeforeUpdate' FROM Inserted i
INNER JOIN Deleted d ON i.ID = d.ID
INSERT INTO xyz_Audit
(AccountID, BillingDate, Amount,Audit_Action)
values(@accountID,@billingDate,@amount,'AfterUpdate');
END
-- Delete Case
IF EXISTS( SELECT * FROM deleted) AND NOT EXISTS(SELECT * FROM inserted)
BEGIN
INSERT INTO xyz_Audit
(AccountID, BillingDate, Amount, Audit_Action)
select accountID,billingDate,amount, 'DELETE'
from deleted
END
我预计如果更新了 9 条记录,那么所有行的更新值之前和之后应该都有,但有时它会跳过。正如您在 Inst.8 中看到的那样,应该有行之前和之后,但它只捕获了行之前然后插入,但实际上没有删除和插入行,只完成了更新。在 9 个中的某个时候,它只在行之前而不是在更新行之后选择,或者有时在更新行之后而不是在更新行之前选择 2 或 3 个。
【问题讨论】:
标签: sql-server tsql database-trigger