2

我正在與一個產品幾乎每個表都有這些列。作爲開發人員,我們經常不得不加入Users表以獲取創建記錄的ID,這只是代碼中的混亂。表中的審計字段(CreatedBy,UpdatedBy)。這是個好主意嗎?

我在設計新產品並再次考慮這一點。它是否必須是這樣?很明顯,知道誰創建了記錄和何時創建是很好的。但有300多個表參考相同的用戶表似乎不是很好..

你是如何處理這樣的事情?我是否應該僅在主要用戶界面上最需要的主要實體上創建CreatedBy列,而不是處理加入?還是我應該去把它放在任何地方?或者也許有另一個「審計」表,我存儲所有這些,並只查看它的需求(不是每次在UI上顯示的實體)

我只是擔心性能方面,每個UI查詢將命中用戶表。 。

編輯:這將是SQL Server 2008 R2的數據庫

+2

爲什麼你認爲「有300多個表引用同一個用戶表似乎並沒有很好」結束了嗎?你基於什麼? – Oded

+0

您可以指定您需要支持的最低版本的SQL Server。正如你所看到的,潛在的建議可能不適合你的版本。用正確的版本提及和/或標記問題總是一個好主意,以節省人力和時間。謝謝。 –

+0

@Aaron:我添加服務器版本 – katit

回答

3

用這種方法的問題是,你只知道是誰創建的行和誰更改行最後。如果最後一個更新行的人正在糾正上一個更新者的錯誤呢?

如果您有興趣對合規或問責原因進行全面審計,您應該查看SQL Server Audit。您可以指定您正在審計哪些表,可以隨時更改這些表,而不必混淆您的模式,並且可以專門針對這些數據編寫查詢,而不是將審計邏輯與普通的應用程序查詢邏輯混合在一起(不必介意每一個表本身的一排)。這也可以讓你審計SELECT查詢,其他潛在的解決方案(觸發器,疾病預防控制中心,變更跟蹤 - 所有這些解決方案都是爲了真正的審計目的而工作或不完成)都不會讓你這樣做。

+1

審計是在SQL Server 2008中引入的,並且在以前的版本中不可用。 – Oded

+0

@Oded公平起見,OP沒有具體說明他們正在使用的SQL Server版本(2008年之前還會打折CDC和更改跟蹤)。雖然不具有普遍性,但假設普通用戶在2008年或以上,或者如果他們必須遷移到Enterprise以利用企業功能,似乎是合理的,但這種升級只是遷移的一部分。 –

+0

我知道。我試圖給答案添加信息,而不是批評它。 – Oded

0

我知道這是一個較舊的帖子,但避免在用戶表上查找的一種方法是取消規範化審計字段。

因此,您不必在CreatedBy字段中使用用戶標識符,而是自己插入用戶名。這將允許在沒有用戶外觀的情況下對錶進行審查,並且還允許用戶表中的任何更改都不會反映在審計字段中。如刪除用戶。

我通常添加如下表的

IsDeleted bit default 0 
CreatedBy varchar(20) 
CreatedOn datetime2 default getdate() 
UpdatedBy varchar(20) 
UpdatedOn datetime2 default getdate() 
相關問題