Sql 触发器仅将实际更改传递到审核表
我只想把对projectd所做的更改传递到审计表中。例如,如果进行了更改,但阀门保持不变,则不会将记录添加到审核表中Sql 触发器仅将实际更改传递到审核表,sql,Sql,我只想把对projectd所做的更改传递到审计表中。例如,如果进行了更改,但阀门保持不变,则不会将记录添加到审核表中 CREATE TRIGGER trgAfterUpdate ON [dbo].[Assets] FOR UPDATE AS declare @assetid int; declare @assetname nvarchar(max); declare @projectid int; declare @audit_action varchar(10
CREATE TRIGGER trgAfterUpdate ON [dbo].[Assets]
FOR UPDATE
AS
declare @assetid int;
declare @assetname nvarchar(max);
declare @projectid int;
declare @audit_action varchar(100);
select @assetid=i.AssetID from inserted i;
select @assetname=i.AssetName from inserted i;
select @projectid=i.ProjectID from inserted i;
if update(ProjectID)
set @audit_action='Updated Record -- After Update Trigger.';
insert into Asset_Test_Audit(AssetID,AssetName,Projectid,Audit_Action,Audit_Timestamp)
values(@assetid,@assetname,@projectid,@audit_action,getdate());
PRINT 'AFTER UPDATE Trigger fired.'
GO
您必须将插入表的结果与删除表的结果进行比较,如下所示:
CREATE TRIGGER trgAfterUpdate ON [dbo].[Assets]
FOR UPDATE
AS
declare @assetid int;
declare @assetname nvarchar(max);
declare @projectid int;
declare @audit_action varchar(100);
select @assetid=i.AssetID from inserted i;
select @assetname=i.AssetName from inserted i;
select @projectid=i.ProjectID from inserted i;
if update(ProjectID) and exists (select * from deleted
where AssetID<>@assetid or AssetName<>@assetname or ProjectID<>@projectid)
begin
set @audit_action='Updated Record -- After Update Trigger.';
insert into Asset_Test_Audit(AssetID,AssetName,Projectid,Audit_Action,Audit_Timestamp)
values(@assetid,@assetname,@projectid,@audit_action,getdate());
PRINT 'AFTER UPDATE Trigger fired.'
end
GO
你可能想做的有点不同。插入和删除的表包含所有更新记录的以前和当前状态,您需要对它们进行全部审核:
CREATE TRIGGER trgAfterUpdate ON [dbo].[Assets]
AFTER UPDATE
AS
set NoCount ON -- So that your insert does not mess with update rowcount
if update(ProjectID)
begin
insert into Asset_Test_Audit(AssetID, AssetName, Projectid, Audit_Action, Audit_Timestamp)
select AssetID, AssetName, ProjectID, 'Updated Record -- After Update Trigger.', getdate()
from Inserted
where not exists (select null from Deleted where Deleted.AssetID = Inserted.AssetID and Deleted.ProjectID = Inserted.ProjectID)
end
PRINT 'AFTER UPDATE Trigger fired.'
GO
几点提示:在一次选择中进行数据检索;使用一个选项,而不是三个从插入中检索列的选项:
select @assetid=i.AssetID, @assetname=i.AssetName, @projectid=i.ProjectID from inserted i;
updateColumnName并不意味着该列的值已更改,只表示它参与了更新:
update assets set ProjectID = ProjectID
在if updateProjectID中仍然返回true
即使在不必要的时候也要使用begin..end,因为它会让你在路上不那么头疼。遗憾的是,您不知道如何保存,但如果不知道,您肯定会知道并感受到痛苦。您使用的是哪种RDBMS?请添加标记。您可以使用INSTEAD OF触发器,因为MS SQL没有BEFORE触发器。