【问题标题】:Retrieve deletedBy in the DELETE Trigger at record deletion删除记录时在 DELETE 触发器中检索 deletedBy
【发布时间】:2018-08-15 20:14:19
【问题描述】:

我有一张桌子。我正在使用触发器来记录记录的更改。有一个字段名为“updatedBy”,记录了执行操作的人(例如插入、更新、删除)

插入和更新没问题,因为我将与其他参数一起插入或更新字段,例如

INSERT INTO T (P1,UPDATEDBY) SELECT 'HELLO','ME'
UPDATE T SET P1 ='WORLD', UPDATEDBY = 'ME'

对于这些操作,我可以发现“ME”已插入/更新记录,因此我可以正确创建日志。但是,如何告诉数据库谁删除了记录呢?因为我只是在执行

DELETE FROM T WHERE P1='WORLD'

谢谢。

【问题讨论】:

  • 标题已更新。
  • 您有单独的审计表来存储已删除的行吗?
  • 我有另一个表来存储完整操作,但主要问题是我在删除记录时无法更新updatedBy字段,我必须在记录删除SQL语句之上实现它

标签: sql-server


【解决方案1】:

那么你需要一张表来保存 CRUD(CReate,Update,Delete) 的活动日志

至少有 3 个参数

  • 姓名
  • 日期
  • 动作

然后在您执行 CRUD 操作或至少仅删除案例时插入到此表中

【讨论】:

  • 但是这违反了我的原始设计,如果我再创建一个表来存储 CRUD,那么我需要在删除操作之上执行它。这与我将其直接插入日志表相同(这意味着我不需要为它再创建一个表)。我的主要问题是可以在删除期间更新 updatedBy :)
【解决方案2】:

如果您想更好地跟踪记录的更改,请使用 SQL Server 中提供的 Magic Tables (Inserted, Deleted)。这两个表将包含有关插入、删除和更新记录的详细信息。

请点击链接以供参考,

http://www.c-sharpcorner.com/UploadFile/93126e/what-are-the-magic-tables-used-by-triggers-in-sql-server/

What are the magic tables available in SQL Server 2000?

或者如果你想取当前用户那么

Getting current user with a sql trigger

【讨论】:

    【解决方案3】:

    如果您通过 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

    【讨论】:

      猜你喜欢
      • 2014-11-11
      • 2011-03-17
      • 2015-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多