Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 触发器仅将实际更改传递到审核表_Sql - Fatal编程技术网

Sql 触发器仅将实际更改传递到审核表

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

我只想把对projectd所做的更改传递到审计表中。例如,如果进行了更改,但阀门保持不变,则不会将记录添加到审核表中

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触发器。