0

我有一个正在处理的触发器,当另一个表应用了插入或更新时,它将向表中插入行。到目前为止,Update 部分有效(我最关心的列是 Balance 列),但是当在 Account 表中添加第一行以进行插入时,在我的 AuditTrailCustomerBalance 表中 OldBalance、NewBalance 和 CustNo 设置为 NULL . 如何让 NewBalance 和 CustNo 引用刚刚从触发器插入到表中的值?

这是触发器:

ALTER TRIGGER AuditTrigger
ON Accounts
FOR INSERT, UPDATE
AS      
IF UPDATE( Balance )
BEGIN
    IF EXISTS
    (
        SELECT 'True'
        FROM Inserted i
        JOIN Deleted d
        ON i.AccountID = d.AccountID
    )
    BEGIN           
        --1. Declare temp variables.
        DECLARE @OldBalance NUMERIC( 18, 0 )
        DECLARE @NewBalance NUMERIC( 18, 0 )
        DECLARE @CustNo INT

        --2. Set the variables.
        SELECT @OldBalance = Balance FROM deleted
        SELECT @NewBalance = Balance FROM inserted
        SELECT @CustNo     = CustNo FROM inserted

        INSERT INTO AuditTrailCustomerBalance( TimeChanged, ChangedBy, OldBalance, NewBalance, CustNo )
        VALUES( GETDATE(), SUSER_SNAME(), @OldBalance, @NewBalance, @CustNo )   
    END
END
GO

和测试语句:

INSERT INTO Custs( CustNo, GivenName, Surname, DOB, SIN )
VALUES( 1, 'Peter', 'Griffen', 'January 15, 1950', '555555555')

INSERT INTO Accounts( CustNo, Type, Balance, AccruedInt, WithdrawalCount )
VALUES( 1, 'Savings', 0, 0, 0 )

UPDATE Accounts SET Balance = 100 
WHERE CustNo = 1
4

2 回答 2

2

我相信你想要这样的东西:

ALTER TRIGGER AuditTrigger
ON Accounts
FOR INSERT, UPDATE
AS  
    INSERT INTO AuditTrailCustomerBalance(TimeChanged, ChangedBy,
                                          OldBalance, NewBalance, CustNo )
    SELECT GETDATE(), SUSER_SNAME(),
           COALESCE(d.Balance,0), i.Balance, i.CustNo
    FROM inserted i
            left join
         deleted d
            on
               i.AccountNo = d.AccountNo
    WHERE
        i.Balance <> d.Balance OR
        d.Balance IS NULL

正如我在评论中所说,inserted并且deleted可以包含(或不包含行),因此您需要考虑到这一点并编写一个基于集合的查询来处理所有这些行 -有些行可能有余额变化和有些不是 - 所以决定是否写任何条目UPDATE(Balance)也是有缺陷的。

于 2013-10-30T14:13:36.183 回答
0

如果您确定您的代码可以编写如下内容:

如果(从插入中选择计数(*))= 1

并执行您的代码。

你可以为插入做这样的:

插入 AuditTrailCustomerBalance (.....) 选择 .... 从插入

正如已经发布的那样,如果您更新一行或多行(插入相同),则触发器的问题在于调用

于 2013-10-30T07:15:45.497 回答