簡體   English   中英

構建數據庫以跟蹤數據的某些更改

[英]Structuring a database to track certain changes to data

我有一個SQL Server 2008 R2數據庫,需要在其中跟蹤對數據所做的某些更改。 到目前為止,我的所有研究都提出了對每個所做的更改進行相當復雜的跟蹤的方法,但是我的案例更為具體,而且我認為更簡單,因為我只需要跟蹤更改,直到批准(由管理員)即可。 。

到目前為止,我唯一想到的方法是為每個受影響的表創建一個pending_changes表,該表跟蹤更改的類型(即INSERTUPDATEDELETE ),主鍵,列名以及其中的位置適用的值或要更改的值。

然后,當更改被批准時,可以由此生成一條SQL語句,以將更改寫入主表。 不過,這聽起來像是一種非常笨拙的方式,並且很難查詢(例如,生成舊值對新值的列表)。

這是一個非常小的數據庫(<1000000行),只有大約5個用戶,因此性能不是問題。

編輯:跟蹤更改的目的是在將更改寫入數據庫之前需要對其進行批准。 數據大部分是具有法律含義的科學數據,因此用戶(在這種情況下是客戶)提出的更改需要由專家進行檢查,然后才能被批准。 一旦獲得批准,我們就不再需要了解舊的價值觀。 包括DELETE語句在內的所有更改都需要得到此批准。 INSERTUPDATE可以通過創建一個包含已更改數據的類似表來處理,但我不確定如何處理刪除。 我還想避免過多的表,因為我需要跟蹤幾個基本表,並且我擔心會增加復雜性。

您可以使用“代替”觸發器。

(未測試)

CREATE TRIGGER IO_Trig_INS_Employee ON Employee
INSTEAD OF INSERT
AS
BEGIN
  insert pending_employee
    select * from inserted
end

http://msdn.microsoft.com/zh-CN/library/ms175521(v=SQL.105).aspx

MERGE關鍵字可以幫助您應用更改。 但是,您可能必須先刪除觸發器,然后才能進行更改。

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

您是否考慮過在應用程序中處理此問題? Sharepoint中的批准工作流之類的方法可能更適合。

您是否在跟蹤更改的目的是防止不良更改發生,還是能夠在更改后重新查看/還原值?

如果您可以允許用戶進行插入/更新/刪除然后由管理員批准,則可以考慮使用OUTPUT INTO子句。 在此頁上,標有“ C.使用OUTPUT INTO和UPDATE語句”一節中有一個很好的示例: http : //msdn.microsoft.com/zh-cn/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

如您所見,這將允許您記錄每列的“之前”和“之后”值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM