我只想在我的表的电子邮件列更新时制作一个表审计/影子表
Posted
技术标签:
【中文标题】我只想在我的表的电子邮件列更新时制作一个表审计/影子表【英文标题】:I want to make a table audit/shadow table only when the email column of my table is updated 【发布时间】:2021-06-08 17:35:28 【问题描述】:当我更新一行(电子邮件)时,触发器将所有数据发送到影子表我只想要更新的一行我在下面的 mt 触发器代码中做错了什么?
CREATE TRIGGER AspNetUsersEmail_trigger
ON AspNetUsers
AFTER INSERT, UPDATE
AS
IF ( UPDATE (Email) )
BEGIN
INSERT INTO [dbo].[AspNetUserEmailAudit]([UserId],[UserName],[Email],[NormalizedEmail],[FirstName],[LastName])
SELECT Id,[UserName],[Email],[NormalizedEmail],[FirstName],[LastName] FROM AspNetUsers
END;
UPDATE [Elearn2].[dbo].[AspNetUsers]
SET Email = 'isaac@gmail.com'
WHERE [Id] = 'A1785377-E3BA-483A-8600-024CA5885951'
【问题讨论】:
标记您的数据库管理系统?是微软的 sql server 吗? 看来,你需要处理插入和删除的虚拟表。目前您将所有数据从 AspNetUsers 复制到审计表 【参考方案1】:您应该使用inserted
表:
CREATE TRIGGER AspNetUsersEmail_trigger
ON AspNetUsers
AFTER INSERT, UPDATE
AS
IF ( UPDATE (Email) )
BEGIN
INSERT INTO [dbo].[AspNetUserEmailAudit]([UserId],[UserName],[Email],[NormalizedEmail],[FirstName],[LastName])
SELECT Id,[UserName],[Email],[NormalizedEmail],[FirstName],[LastName]
FROM INSERTED
END;
阅读更多关于这些特殊表的信息here
【讨论】:
请注意,即使所有列都没有更改但该行存在于更新中,这仍会插入。否则你需要EXCEPT SELECT ... FROM deleted
【参考方案2】:
在 MS SQL 中,您必须从插入的表中选择数据。
删除和插入的表存在于触发器中,并包含删除和更新/插入的行。
【讨论】:
以上是关于我只想在我的表的电子邮件列更新时制作一个表审计/影子表的主要内容,如果未能解决你的问题,请参考以下文章