我有一个SQL Server 2008 R2数据库,我需要在其中跟踪对数据所做的某些更改。到目前为止,我的所有研究都提出了对每个变更进行相当复杂的跟踪的方法,但我的情况更为具体,我认为更简单,因为我只需要跟踪变更,直到它被批准(由管理员) 。
到目前为止,我能想到的唯一方法是,对于每个受影响的表,创建一个跟踪变更类型的pending_changes
表(即INSERT
,UPDATE
或DELETE
),主键,列名称,以及(如果适用)要更改的值。
然后,当批准更改时,可以从此生成SQL语句以将更改写入主表。这感觉就像是一种非常笨拙的方式,并且很难对此进行查询(例如,生成一个旧的和新的值列表)。
这是一个非常小的数据库(< 1000000行),只有大约5个用户,因此性能不是问题。
修改
跟踪更改的目的是在将它们写入数据库之前需要获得批准。数据主要是科学的,具有法律含义,因此用户提出的更改(在这种情况下是客户)需要由专家进行检查才能获得批准。一旦获得批准,我们就不再需要知道旧的价值了。所有更改(包括DELETE
语句)都需要此批准。可以通过创建一个包含已更改数据的类似表来处理INSERT
和UPDATE
,但我不确定如何处理删除。我还想避免使用太多额外的表,因为我需要跟踪几个基表,并且我担心会增加复杂性。
答案 0 :(得分:0)
您可以使用“代替”触发器。
(未经测试)
CREATE TRIGGER IO_Trig_INS_Employee ON Employee
INSTEAD OF INSERT
AS
BEGIN
insert pending_employee
select * from inserted
end
http://msdn.microsoft.com/en-us/library/ms175521(v=SQL.105).aspx
MERGE关键字可以帮助您应用更改。您可能不得不在进行更改之前放下触发器。
http://msdn.microsoft.com/en-us/library/bb510625.aspx
您是否考虑过在申请中处理此问题?像Sharepoint中的批准工作流程可能更适合。
答案 1 :(得分:0)
您是在跟踪这些更改的目的是在制作之前预防不需要的更改,还是能够在创建后重新审核/还原这些值?
如果您可以允许用户进行插入/更新/删除,然后让管理员批准它,请考虑使用OUTPUT INTO子句。在此页面标有“C.使用带有UPDATE语句的OUTPUT INTO”部分中有一个很好的示例: http://msdn.microsoft.com/en-us/library/ms177564.aspx
USE AdventureWorks2012;
GO
DECLARE @MyTableVar table(
EmpID int NOT NULL,
OldVacationHours int,
NewVacationHours int,
ModifiedDate datetime);
UPDATE TOP (10) HumanResources.Employee
SET VacationHours = VacationHours * 1.25,
ModifiedDate = GETDATE()
OUTPUT inserted.BusinessEntityID,
deleted.VacationHours,
inserted.VacationHours,
inserted.ModifiedDate
INTO @MyTableVar;
--Display the result set of the table variable.
SELECT EmpID, OldVacationHours, NewVacationHours, ModifiedDate
FROM @MyTableVar;
GO
--Display the result set of the table.
SELECT TOP (10) BusinessEntityID, VacationHours, ModifiedDate
FROM HumanResources.Employee;
GO
如您所见,这将允许您记录每列的“之前”和“之后”值。