2013-02-16 100 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