如果您通过 ado.net 或实体框架中的应用程序进行删除,则无法跟踪谁删除了记录,您可以像我一样使用一个简单的技巧,它工作得非常好,只需最少的更改和表格中没有额外的列。
ALTER trigger [dbo].[CreateLogCart]
on [dbo].[Cart]
after UPDATE, INSERT, DELETE
as
declare @targetID bigint,
@user int,
@activity varchar(10);
if exists(SELECT 1 from inserted) and exists (SELECT 1 from deleted)
begin
SET @activity = 'UPDATE';
**-- update createdby before delete and do not log**-----------------------------
declare @iby int;
declare @dby int;
**-- update createdvy before delete and do not log**------------------------------
SELECT @targetID = d.CartId, @dby = d.CreatedBy from deleted d;
SELECT @user = d.modifiedby, @iby = d.CreatedBy from inserted d;
if(@iby = @dby) **-- update createdby before delete and do not log** --------
begin
INSERT into AuditCart(CartId, UserId, AppId, Description, CreatedBy, CreatedOn, ModifiedBy, ModifiedOn, Activity, ActivityBy, ActivityOn)
select @targetID, d.userid, d.AppId, d.Description, d.CreatedBy, d.CreatedOn, d.ModifiedBy, d.ModifiedOn, @activity, @user, getdate() from deleted d
end
end
If exists (Select 1 from inserted) and not exists(Select 1 from deleted)
begin
SET @activity = 'INSERT';
SELECT @targetID = i.CartId from inserted i;
SELECT @user = d.modifiedby from inserted d;
INSERT into AuditCart(CartId, UserId, AppId, Description, CreatedBy, CreatedOn, ModifiedBy, ModifiedOn, Activity, ActivityBy, ActivityOn)
select @targetID, d.userid, d.AppId, d.Description, d.CreatedBy, d.CreatedOn, d.ModifiedBy, d.ModifiedOn, @activity, @user, getdate() from inserted d
end
If exists(select 1 from deleted) and not exists(Select 1 from inserted)
begin
**-- revert createdby updated in delete operation**--------------
declare @cby int;
SET @cby = (select top 1 CreatedBy from dbo.AuditCart where Activity = 'INSERT' and CartId = (select d.CartId from deleted d) order by CreatedOn desc);
**-- revert createdby updated in delete operation**-------------
SET @activity = 'DELETE';
SELECT @targetID = i.CartId from deleted i;
SELECT @user = d.CreatedBy from deleted d;
INSERT into AuditCart(CartId, UserId, AppId, Description, CreatedBy, CreatedOn, ModifiedBy, ModifiedOn, Activity, ActivityBy, ActivityOn)
select @targetID, d.userid, d.AppId, d.Description, ****@cby****, d.CreatedOn, d.ModifiedBy, d.ModifiedOn, @activity, @user, getdate() from deleted d
end
您只需要在删除之前更新 createdby 并且不要将其记录在更新触发器中,因为我将 if 条件放在更新触发器中,
现在在删除触发器中,您只需要通过从插入的旧日志中获取 createdby 来恢复它,在我的情况下,将它的值作为 activityby