2009-01-08 95 views
0

我在工作中遇到數據庫問題。目前正在進行審計,但其笨拙,需要很多維護,而且在一些方面缺乏。所以我正在取代它。MS SQL審計

我想以儘可能通用的方式做到這一點,並設計了表格,以及如何鏈接和更新所有內容。

現在,這一切都很好,但我希望能夠寫一個通用的方式來插入記錄到這些審計表。 (無需爲每個表中的每列都輸入一條命令)

反正在存儲過程中迭代表中的所有列嗎?我想以這種方式編寫它,它將與多個表一起工作,並自動拾取和審計添加的列等。

任何想法?

編輯:猜猜我應該澄清。我將審覈表中的數據。但是我將使用相同的表來存儲數據庫中每個表的審計數據。

而且我不能使用觸發器,因爲通常,當更新發生時,它會發生在多個表中,但我希望所有這些更新都是單個更改集的一部分。

這不是問題,因爲我可以在單個存儲過程中執行所有更新。我只是喜歡像循環一樣的方式,我可以得到所有更新的字段,找出哪些更改,並將更改後的插入到審計表中。

我想這樣做沒有一長串if語句和每列插入語句。 (通過在通用循環中執行此操作,它將自動處理添加的列,而不會受到刪除列的困擾)

回答

0

會出現性能方面的問題,但您可以將插入和更新觸發器添加到所有表中,觸發器插入到您的審計表中。

+0

我寧願不必這樣做,因爲那樣我就不得不提前知道每一列。我希望這個系統能夠自動選擇新的列,並且在沒有任何干預的情況下忽略已刪除的列。我想做一切從存儲特效。 – TJMonk15 2009-01-08 18:50:02

+0

我可以理解想要通過procs做所有事情,但使用COLUMNS_UPDATED(),你應該能夠確定哪些列被更新,而不必知道表中的列是什麼。 – cmsjr 2009-01-08 18:56:06

1

通過「添加列」我想你正在審計DDL。如果你使用SQL 2005,那麼你想要this link

如果不使用SQL 2005,那麼您可能要使用SQL模式比較工具之一,比如SQL Red Gates工具集可能有一些內容。

如果您沒有$ for工具,那麼您可能只想對information_schema.tables和information_schema.columns運行定期查詢。通過定期採集這些在permenant表,可以識別時,他們已獲得或失去行(並因此改變了模式發生)

如果你正在做數據審覈,而不是,那麼你要想要的代碼生成一些觸發器,再次使用information_schema.tables和information_schema.columns。

0

這可能,如果你使用的是數據訪問層可以捕獲哪些表和列正在更新,並生成審計表的INSERT語句來完成。在存儲過程中?哪個存儲過程?你有單一的更新嗎?或者你是每桌創建一個?

0

如果這是您的選擇,只需升級到sql server 2008並打開更改數據捕獲。