2010-07-27 53 views
1

我想在每個數據庫表中插入createdBy,modifiedBy,createDate,modifiedDate列以管理用戶活動。我應該在哪裏管理createdBy,modifiedBy,createDate和modifiedDate?

這是我第一次嘗試做到這一點。有沒有我能遵循的最佳做法?任何設計模式都能很好地管理這個?

我首先想到的是做這在我的商業邏輯層,並在每一個業務類插入和更新的方法,我做這樣的事情:

class.createDate = DateTime.Now;

class.modifiedDate = DateTime.Now;

class.modifiedBy = CurrentUser.Id;

class.createdBy = CurrentUser.Id;

還是有更好的辦法?

布賴恩

回答

0

那麼有一件事要考慮的是你要加蓋什麼時候?你想要應用服務器的時間還是數據庫服務器上的時間?我總是去DB服務器。所以在這種情況下,存儲過程(或SQL語句)應該獲取當前時間。

-Krip

+0

用戶名或userId是誰做的動作? – 2010-07-27 13:07:46

+0

是的,這需要通過業務層完成。但是,如果有人使用數據庫管理工具直接操縱數據,我會在數據庫級別使用默認值。這樣,即使業務層/應用程序被繞過,用戶名也會被蓋印。 – Krip 2010-07-27 15:19:53

+0

我還沒有考慮過有人會直接從數據庫中做些什麼。這是一個好點。 – 2010-07-28 01:24:24

0

你應該只在數據庫標籤管理CreatedDateModfiedDate。 CreatedDate的默認值應爲Getdate()/SYSDATE,您無需設置此值。對於ModifiedDate,每次更新時再次設置GETDATE()/SYSDATE

只需要將ModifiedBy用戶標識從應用程序傳遞到數據庫,以防插入設置列的用戶標識,並且在更新的情況下僅更新由用戶標識修改的列。

+0

所以你的意思是做觸發器的時間,並在asp.net代碼做userid? – 2010-07-27 13:09:06

+0

數據庫級別的插入/更新時間(不觸發),並且您需要從ASP.NET代碼中傳遞登錄的用戶標識。 – PSK 2010-07-27 13:31:21

1

這取決於您正在管理什麼類型的業務對象以及需要創建/修改數據的規則是什麼。在大多數情況下,這是數據庫審計跟蹤,業務邏輯層中不需要此信息。在這種情況下,這些信息應該只存在於數據庫級別。如果您使用的是ORM,那可能意味着您仍然使用對象保存數據。如果你正在使用存儲的特效,那麼他們都需要知道如何使用用戶名來標記記錄。日期時間可以通過在列上設置GetDate()的默認值來處理。

+0

我正在使用ORM。由於UserName或UserId可以很容易地從asp.net代碼中獲得,所以這就是爲什麼我想在數據庫存儲過程中立即執行asp.net代碼中的所有工作。 – 2010-07-27 13:07:10

0

對於createdBy和modifiedBy,我通常使用當前用戶的用戶名在我的業務層中進行設置。對於createDate和modifiedDate,我在數據庫的'after'觸發器中執行此操作。

+0

你有我所關心的。由於UserName或UserId可以很容易地從asp.net代碼中獲得,所以這就是爲什麼我想在數據庫存儲過程中立即執行asp.net代碼中的所有工作。 – 2010-07-27 13:08:21

+0

如果有人通過應用程序之外的數據庫工具操縱數據會怎麼樣?所以一些數據庫默認的郵票用戶名將是有用的。例如,SQL Server具有SUSER_SNAME()用於此目的。然後,您仍然可以傳入應用程序用戶名來覆蓋默認值。 – Krip 2010-07-27 15:21:35

+0

我不認爲有人會直接從數據庫做些事情。這是一個好點。 – 2010-07-28 01:23:40