基于触发器的SQL Server审核

时间:2017-04-18 08:57:14

标签: sql-server vb.net triggers auditing

我正在开发一个简单的VB NET / WPF应用程序,该应用程序与SQL Server 2012数据库进行通信,至少有两个或更多人可以同时使用它。

为了跟踪数据库中的任何和每一个变化(INSERT / UPDATE / DELETE),我正在实现一个简单的基于触发器的审计系统,显然,任何更新/删除/插入的数据都保存在相应的审核表,同时还跟踪用户和操作的日期/时间。

我在搜索时显然找到了大量的向导。但我注意到大多数SQL Server指南会在查询中使用JOIN来提取存储在InsertedDeleted表中的数据,而我在没有任何JOIN的情况下实现了相同的结果。

例如:

  • 我的INSERT触发器:

    CREATE TRIGGER [HumanResources].[after_insert_humanresources_shift]
    ON [HumanResources].[Shift]
    AFTER INSERT
    AS
    BEGIN
    INSERT INTO [HumanResources].[Shift_Audit] 
    (
        -- [EventID], [EventBy] and [EventOn] have autovalues
        [EventType],
        [ShiftID],
        [Name],
        [StartTime],
        [EndTime],
        [ModifiedDate]
    )   
    SELECT 
         'INSERT',
        [ShiftID], 
        [Name], 
        [StartTime], 
        [EndTime], 
        [ModifiedDate]
    FROM 
        [Inserted]
    END
    
  • This guide's INSERT触发器:

    create trigger tblTriggerAuditRecord on tblOrders
    after insert
    as
    begin
      insert into tblOrdersAudit 
      (OrderID, OrderApprovalDateTime, OrderStatus, UpdatedBy, UpdatedOn )
      select i.OrderID, i.OrderApprovalDateTime, i.OrderStatus, SUSER_SNAME(), getdate() 
      from  tblOrders t 
      inner join inserted i on t.OrderID=i.OrderID 
    end
    

我的DELETE和UPDATE触发器完全相同。所有这些都适用于单个D / U / I查询或多个查询(例如,单个查询中的多个更新)。我应该使用JOIN的具体原因是什么?

1 个答案:

答案 0 :(得分:1)

是的"内部联接插入了t.OrderID = i.OrderID"检查订单表的依赖关系,并且只插入订单表中有真实订单的记录,插入独立表不会在实体级别测试数据的依赖关系。希望有所帮助。