2012-03-01 19 views
0

私は、ProjectIDに対する変更を監査テーブルに渡すだけです。たとえば変更が行われたが、バルブが同じままである場合、レコードは監査テーブルに追加されません。監査テーブルへの実際の変更を渡すだけのトリガー

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 
+0

どのRDBMSがありますか?タグを追加してください。 – vulkanino

+0

MS SQLには 'BEFORE'トリガがないので、' INSTEAD OF'トリガを使うことができます。 – vulkanino

答えて

0

あなたは以下のような削除されたテーブルに挿入されたテーブルからの結果を比較する必要があります。

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 
+0

ありがとうございます – user1240661

0

あなたは少し違っそれをしたいかもしれません。挿入し、テーブルが更新されたすべてのレコードの以前と現在の状態を保持し、あなたがそれらすべてを監査する必要があります削除:

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 

いくつかのポインタ:選択1でデータ検索を行います。その列の値が変更されている意味するものではありません

select @assetid=i.AssetID, @assetname=i.AssetName, @projectid=i.ProjectID from inserted i; 

更新(ColumnNameに)、単にそれが更新に参加したと述べている:代わりに挿入されたから列を取得選択3の、いずれかを使用

update assets set ProjectID = ProjectID 
更新(ProjectID)の場合は、

にtrueを返します。

これは、頭痛を軽減するために必要ではない場合でも、begin..endを使用してください。悲しいことに、あなたはセーブについて知りませんが、そうしなければあなたは確かに(そして痛みを感じるでしょう)。

関連する問題