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;
您需要比较 inserted
和 deleted
表以检查数据是否确实已更改。
在考虑空值的同时做到这一点的最简单方法是使用 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
我现在的代码可以正确更新影子 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;
您需要比较 inserted
和 deleted
表以检查数据是否确实已更改。
在考虑空值的同时做到这一点的最简单方法是使用 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