基于触发器的SQL Server审计
问题描述:
我正在研究一个与SQL Server 2012数据库进行通信的简单VB .NET/WPF应用程序,该数据库至少有两个或更多人可以同时使用。为了跟踪数据库(INSERT/UPDATE/DELETE)中的任何更改(INSERT/UPDATE/DELETE),我正在实现一个简单的基于触发器的审计系统,显然,任何更新/删除/插入的数据都将保存在其中相应的审计表,同时也跟踪用户和操作日期/时间。基于触发器的SQL Server审计
我显然在搜索时发现了很多指南。但我注意到,大多数SQL Server指南都会在查询中使用JOIN来提取存储在Inserted
或Deleted
表中的数据,而我在没有任何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触发器做的都是同样THI NG。所有这些都适用于单个D/U/I查询或多个查询(例如,在单个查询中有多个更新)。为什么我应该使用JOIN有特定的原因吗?
答
是的“内部连接插入我t.OrderID = i.OrderID”检查订单表的依赖关系,并且将只插入订单表中存在真实订单的记录,插入到独立表不检测在实体级别的依赖关系数据。希望有所帮助。
这是否意味着'Inserted'和'Deleted'表可能已经包含数据,这与触发触发器的查询所更改的数据不同? – Naucle
您还需要审查如何处理同一记录的多个更新,以及如何为每个用户构建更新历史记录,可能包括按更新日期更新的位置等等。有许多方法可以在CDC内实现此审核(更改数据捕获)使用SSIS,我已经粘贴了一个例子让你浏览。希望这可以帮助。 https://docs.microsoft.com/en-us/sql/integration-services/change-data-capture/change-data-capture-ssis – jimmy8ball
据我的理解,每个DELETE查询生成自己的独立的'Deleted'表包含被所述查询删除的一行或多行,所以触发器知道在哪里查找,而不必加入ID,这通过我在触发器上进行的测试来确认。你能提供一个能解释你的观点的例子吗?另外,我已经尝试过CDC,问题是,没有办法跟踪提交更改的用户。 – Naucle