2011-09-01 61 views
2

只是想知道有關日誌數據修改。如何記錄在sql server表中更改的數據。哪種方法更好

我見過跟蹤數據變化(DML)的方法。

  1. 使用觸發器
  2. 在同一個表中保持列添加日期,添加者,修改日期,修改者。

使用方法(1),我可以寫觸發器,插入/刪除/更新每個表記錄的變化,因此可以應用在所有表按要求外鍵關係等方面的限制類似唯一鍵約束。

但我不明白它是如何可以應用使用方法(2)各種約束。 由於我必須製作複合獨特密鑰並且必須考慮更多的列。

數據庫表中是否存在任何設計問題。方法(2)記錄數據的建議方式是什麼?

哪種方法更好。

而且我來自我的一些同事知道,觸發器做不火批量插入查詢,是真的嗎?

+0

好問題,我已經看到/使用了兩種方法,但都沒有看起來正確,我認爲rdbms應該提供一些內置功能。 –

+0

在Sql Server 2008中,引入了一項新功能,即提供相同功能的** CDC「更改數據捕獲」**。但我擔心以前的版本。 –

+0

CDC告訴你什麼改變了(包括實際數據),改變跟蹤告訴你哪些行已經改變,但是都沒有告訴你是誰做的。審計可能是您唯一的避免觸發器的內置功能,但它需要Enterprise。對於你的2.如果你不使用觸發器你如何捕獲特別更新的信息? –

回答

2

我最喜歡的解決方案是要求(如果可能,使用安全功能)訪問所有應用程序數據(或至少所有CRUD操作)以完成存儲過程,並讓SP管理變更跟蹤和審計。

觸發器的問題是它們不能很好地擴展;他們可以通過將批量插入或更新轉換爲許多單行操作來施加顯着的性能命中。

至於是否保留在行或其他表的變化,我的偏好是使用另一個表。這樣,我就可以在需要的時候獲得實際變化的歷史記錄,而不僅僅是在什麼時候。保持源表縮小也可以幫助查詢/讀取性能。

您也可以申請分配到審計表,這將使得他們很容易在時機成熟時,以年齡關閉/下降。

1

你錯過了一個大的:Change Data Capture。 Sql Server企業版已內置此功能。

+0

謝謝。只有我們會根據客戶的來改變我們的數據庫服務器的問題。所以我們試圖儘可能減少對數據庫服務器的依賴。但是,謝謝你提出這一點。 –

相關問題