2011-05-13 32 views
6

我搜索了半天,沒有發現這裏的解決方案還沒有創建一個改變歷史。這個問題也有點主觀。但我真的需要一個好的解決方案來完成這項任務。最佳解決方案,爲幾個SQL表

我有一個卷,安全性和更多信息的表格。 此數據每天更新。 現在我需要保持此歷史變更

什麼是最好的解決方案呢? 製作具有相同結構的第二張表格,只需將「舊」數據插入此表格中? 或者只是使用狀態創建一個附加參數?

使這個服務器端觸發器? 或以編程方式使用LINQ過程?

回答

5

我們選擇了單獨的表格,因爲它將保持您的主表精益和更快。我們也選擇了觸發器,推理如果你改變了入口機制,你不會想要重寫你的審計。它還可以捕獲意外的DBA端更改。

由於更新是有效的刪除,然後插入,你能達到什麼已經建議用一個單一的TRIGGER-這就是我們所做的。

  • 創建表的現有表完全一致,但增加了一些列: AUDIT_GUID VARCHAR(40), AUDIT_TIMESTAMP DATETIME, AUDIT_ACTION VARCHAR(20)

  • 創建「AFTER INSERT, DELETE,UPDATE「使用以下常規模式觸發(只需在必要時添加更多列)。

    CREATE TRIGGER CustomerAudit ON Customer 
    AFTER INSERT,DELETE,UPDATE AS 
    BEGIN 
        IF (TRIGGER_NESTLEVEL()>1) RETURN 
    
        DECLARE @Time DateTime = CURRENT_TIMESTAMP 
        DECLARE @Audit_GUID varchar(100) = NEWID() 
    
        INSERT INTO Customer_History (FirstName, LastName, Audit_Date, Audit_Action, Audit_GUID) 
        SELECT 
         FirstName, LastName, @Time, 'Delete', @Audit_GUID 
        FROM 
         Deleted 
    
        INSERT INTO Customer_History 
    (FirstName, LastName, Audit_Date, Audit_Action, Audit_GUID) 
        SELECT 
         FirstName, LastName, @Time, 'Insert', @Audit_GUID 
        FROM 
         Inserted 
    END 
    

如果你想找到的更新,他們將在歷史錶行有一個刪除&更新與同Audit_GUID值。時間戳還允許您檢查在某個特定時間所做的更改,並且我們還添加了當前用戶以在必要時查找責任人!

+0

(如果有人可以建議我怎樣才能讓StackOverflow正確地格式化這段代碼,請讓我知道) – Runonthespot 2011-05-13 09:44:19

+0

@Runonthespot:子彈後面的代碼需要8個前導空格才能正確格式化。我還在列表中添加了逗號後面的空格,這似乎有助於「解開」冗長的行。 – 2011-05-13 09:48:34

+0

@Catcall,非常感謝。 – Runonthespot 2011-05-13 09:49:30

1

我認爲它能夠更好地創建一個單獨的表來跟蹤歷史與所需的字段和日期一起,以便有需要時可以查詢該表。您可以使用觸發器進行記錄。

2

我會選擇一個ON DELETE/ON UPDATE觸發器,其存儲刪除或修改行的第二表。

這樣你

  • 能跟上參照完整性
  • 可以在你的「實時數據」表建立合理的唯一鍵
  • 不必記得添加WHERE IsDeleted = 'N'(等)每個查詢你讓
  • 有你的數據的自動歷史化,即使你直接修改它的數據庫

這使您的實時數據保持可用性和性能。對於歷史數據,您必須轉至歷史記錄表,根據我的經驗,如果查詢非常複雜,並且您希望將現場數據和歷史數據混合到一個結果中,這些數據可能會非常麻煩。取決於你的用例,如果這種用法是可能的情況。

+0

您可以使用'UNION ALL'創建一個視圖來合併實時和歷史數據。 – 2011-05-13 09:51:26

+0

嘿Tomalak.Thanks很多您的答案。這真的幫助我很多我的下一步 – SwissGuy 2011-05-13 09:51:52

+0

@SwissGuy:很高興我能幫助你。 :) – Tomalak 2011-05-13 11:31:21

0

我建議創建一個歷史表(後綴_HIST)所有數據。您需要三個觸發器來存儲UPDATES,DELETIONS和INSERTIONS。

0

不要建立你不能買現成的東西。谷歌的數據庫審計軟件,那裏有很多。