我只想在我的表的电子邮件列更新时制作一个表审计/影子表

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 中,您必须从插入的表中选择数据。

删除和插入的表存在于触发器中,并包含删除和更新/插入的行。

【讨论】:

以上是关于我只想在我的表的电子邮件列更新时制作一个表审计/影子表的主要内容,如果未能解决你的问题,请参考以下文章

从过滤表的一列复制/粘贴/计算可见单元格

在 Oracle 中审计 DML 更改

如何使用触发器将基表的所有更新列添加到审计表的多行?

在 Mysql 中添加新列时如何轻松维护审计触发器

Oracle:在更新具有多列的表的一个字段时复制行

审计截断和丢弃