我正在开发一个简单的VB NET / WPF应用程序,该应用程序与SQL Server 2012数据库进行通信,至少有两个或更多人可以同时使用它。
为了跟踪数据库中的任何和每一个变化(INSERT / UPDATE / DELETE),我正在实现一个简单的基于触发器的审计系统,显然,任何更新/删除/插入的数据都保存在相应的审核表,同时还跟踪用户和操作的日期/时间。
我在搜索时显然找到了大量的向导。但我注意到大多数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触发器完全相同。所有这些都适用于单个D / U / I查询或多个查询(例如,单个查询中的多个更新)。我应该使用JOIN的具体原因是什么?
答案 0 :(得分:1)
是的"内部联接插入了t.OrderID = i.OrderID"检查订单表的依赖关系,并且只插入订单表中有真实订单的记录,插入独立表不会在实体级别测试数据的依赖关系。希望有所帮助。