构建数据库以跟踪对数据的某些更改

时间:2013-02-16 13:30:05

标签: sql sql-server database data-structures

我有一个SQL Server 2008 R2数据库,我需要在其中跟踪对数据所做的某些更改。到目前为止,我的所有研究都提出了对每个变更进行相当复杂的跟踪的方法,但我的情况更为具体,我认为更简单,因为我只需要跟踪变更,直到它被批准(由管理员) 。

到目前为止,我能想到的唯一方法是,对于每个受影响的表,创建一个跟踪变更类型的pending_changes表(即INSERTUPDATEDELETE),主键,列名称,以及(如果适用)要更改的值。

然后,当批准更改时,可以从此生成SQL语句以将更改写入主表。这感觉就像是一种非常笨拙的方式,并且很难对此进行查询(例如,生成一个旧的和新的值列表)。

这是一个非常小的数据库(< 1000000行),只有大约5个用户,因此性能不是问题。

修改 跟踪更改的目的是在将它们写入数据库之前需要获得批准。数据主要是科学的,具有法律含义,因此用户提出的更改(在这种情况下是客户)需要由专家进行检查才能获得批准。一旦获得批准,我们就不再需要知道旧的价值了。所有更改(包括DELETE语句)都需要此批准。可以通过创建一个包含已更改数据的类似表来处理INSERTUPDATE,但我不确定如何处理删除。我还想避免使用太多额外的表,因为我需要跟踪几个基表,并且我担心会增加复杂性。

2 个答案:

答案 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

如您所见,这将允许您记录每列的“之前”和“之后”值。