2013-02-16 66 views
0

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

到目前为止,我能想到的唯一办法做到这一点,对于每个受影响的表,创建一个表追踪(即INSERTUPDATEDELETE)类型的变化,主键列名,以及在适用的情况下,要改变的数值。

然后,当更改被批准时,可以从中生成一条SQL语句将更改写入主表。这感觉就像是一种非常笨拙的做法,而且很难查询它(例如产生一个旧的vs新的值的列表)。

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

编辑: 跟踪变化的目的是,他们需要被批准之后才能写入数据库。数据主要是科学的,具有法律影响,因此用户(本例中为客户)提出的更改需要专家检查,然后才能获得批准。一旦他们获得批准,我们不需要再知道旧的价值观。所有更改,包括DELETE声明都需要此批准。 INSERTUPDATE可以通过创建一个包含更改数据的类似表来处理,但我不知道如何处理删除。我也想避免额外的表格太多,因为我需要跟踪几个基表,而且我担心增加的复杂性。

回答

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

合并关键字可与施加的变化帮助。在进行更改之前,您可能不得不放弃触发器。

http://msdn.microsoft.com/en-us/library/bb510625.aspx

你有没有考虑在应用程序中处理呢?像Sharepoint中的批准工作流程可能更适合。

+0

没有想过触发器 - 我以前没有用过它们,所以我不太熟悉它们的功能,但我会阅读!我曾想过在应用程序方面做这件事,但认为在数据库中实现它可能更强大。 – aquavitae 2013-02-16 13:53:01

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 

正如你所看到的,这将让你无论是“之前”和记录“之后”每列的值。

+0

感谢您的回答,但不是我正在寻找的。我已经用更多信息更新了我的问题。我关心的是如何构建数据库进行跟踪,而不是如何将数据导入到数据库中 - 我可能会通过带有Web界面的ORM进行操作。 – aquavitae 2013-02-17 14:34:03