SQL 为值更改的列保存影子 table

SQL saving shadow table for a column on value change

我现在的代码可以正确更新影子 table,但我遇到的唯一问题是如果电子邮件值相同,它仍会更新影子 table。这不是我想要的。我需要影子 table 仅在电子邮件更改未更新时更新我该怎么做?例如“email@email.com”原始值应该只在 table 将该值更改为不同的值时更新,例如“secoundemail@gmail.com”

CREATE TRIGGER AspNetUsersEmail_trigger
ON AspNetUsers
AFTER UPDATE 
AS
*  IF ( UPDATE (Email) )* what could I use here instead of update?
    BEGIN
    INSERT INTO [dbo].[AspNetUserEmailAudit]([UserId],[UserName],[Email],[NormalizedEmail],[FirstName],[LastName])
    SELECT Id,[UserName],[Email],[NormalizedEmail],[FirstName],[LastName] 
    FROM INSERTED
    END;

您需要比较 inserteddeleted 表以检查数据是否确实已更改。

在考虑空值的同时做到这一点的最简单方法是使用 EXCEPT。确保与相同的主键进行比较。

请注意,您仍然可以使用 IF(UPDATE 作为早期退出条件,但只有在该列根本不存在时才会退出。如果该列存在但数据未更改,它将不起作用。

CREATE TRIGGER AspNetUsersEmail_trigger
ON AspNetUsers
AFTER UPDATE 
AS

SET NOCOUNT ON;

IF (UPDATE(Email))
    INSERT INTO [dbo].[AspNetUserEmailAudit]
        (UserId, UserName, Email, NormalizedEmail, FirstName, LastName)
    SELECT Id, UserName, Email, NormalizedEmail, FirstName, LastName
    FROM inserted i
    WHERE EXISTS (SELECT i.Id, i.Email   -- always include the primary key
                  EXCEPT
                  SELECT d.Id, d.Email
                  FROM deleted d);

GO