0

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

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

然后,当更改被批准时,可以从中生成一条 SQL 语句,将更改写入主表。不过,这感觉是一种非常笨拙的方法,并且很难查询(例如,生成旧值与新值的列表)。

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

编辑: 跟踪更改的目的是在将它们写入数据库之前需要对其进行批准。这些数据大多是具有法律含义的科学数据,因此用户(在本例中为客户)提出的更改需要经过专家检查才能获得批准。一旦它们被批准,我们就不再需要知道旧值了。所有更改,包括DELETE声明,都需要此批准。 INSERT并且UPDATE可以通过创建一个包含更改数据的类似表来处理,但我不确定如何处理删除。我还想避免过多的额外表,因为我需要跟踪几个基表,而且我担心增加的复杂性。

4

2 回答 2

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 中的审批工作流之类的东西可能更适合。

于 2013-02-16T13:43:46.000 回答
0

您是否正在跟踪更改以防止在进行不受欢迎的更改之前进行更改,或者在更改更改后能够查看/恢复值?

如果您可以允许用户进行插入/更新/删除然后让管理员批准它,请考虑使用 OUTPUT INTO 子句。在此页面上标记为“C. 将 OUTPUT INTO 与 UPDATE 语句一起使用”的部分中有一个很好的示例: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

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

于 2013-02-17T01:12:37.607 回答