2010-07-01 140 views
0

我在我的C#應用​​程序中使用強類型數據集,我希望能夠記錄用戶對行進行的任何更改。做這個的最好方式是什麼?日誌記錄數據庫行更改

回答

0

是否希望能夠訪問C#應用程序中的更改?或者這僅僅是爲了記錄/審計目的?您的強類型數據集是映射到SQL Server表的XSD數據集嗎?

觸發SQL服務器

在一個大的訂貨系統,我幫世邦魏理仕開發上,我們創造了額外的表來保存版本的數據。假設你有一張請求表。創建一個Request_changes表。然後,您爲INSERT和UPDATE觸發器是這樣的:

CREATE TRIGGER [dbo].[tr_Request_update] 
ON [dbo].[Request] 
FOR UPDATE 
AS 
    SET NOCOUNT ON 
    INSERT INTO dbo.Request_changes 
    (
     --ID,  // taken care of by IDENTITY(1,1) 
     --LogDate, // uses default value of GetDate() 
     ChangeAction, 
     SQLServerUser, 

     RequestID, 
     UserIDContact, 
     etc 
    ) 
    SELECT 
     'UPDATE', 
     system_user, 

     -- Request fields 
     RequestID, 
     UserIDContact, 
     etc 
    FROM 
     inserted 

    SET NOCOUNT OFF 
GO 

create TRIGGER [dbo].[tr_Request_insert] 
ON [dbo].[Request] 
FOR INSERT 
AS 
    SET NOCOUNT ON 
    INSERT INTO dbo.Request_changes 
    (
     --ID,  // taken care of by IDENTITY(1,1) 
     --LogDate, // uses default value of GetDate() 
     ChangeAction, 
     SQLServerUser, 

     RequestID, 
     UserIDContact, 
     Title, 
     etc 
    ) 
    SELECT 
     'INSERT', 
     system_user, 

     -- Request fields 
     RequestID, 
     UserIDContact, 
     etc 
    FROM 
     inserted 

    SET NOCOUNT OFF 
GO 

您不必訪問_changes表(除非其映射到另一個XSD數據集),但它是偉大的記錄和審計和跟蹤降低錯誤和歷史。

其他選項

也許你有沒有被持久性存儲支持,如SQL服務器的XSD數據集,你僅僅使用在內存中的數據集。有很多其他設計模式和衆所周知的構造可以在屬性值發生變化時通知您。

另外,如果您使用的是XSD數據集,是因爲您正在使用現有的代碼庫還是遺留應用程序?如果你正在做新的發展,我會擺脫它們。這是MS不再積極發展的一種老技術。如果你想留在當前版本的Visual Studio附帶的MS堆棧中,你最好的選擇是Linq to Sql或Entity Framework,這兩者應該更容易處理,並且更靈活(例如,我不喜歡認爲XSD數據集非常好地處理空值,並且它們不支持生成的類中的.NET可空類型)。

+0

這是一個遺留系統,正在進行用戶審計改造。它目前具有基於RowChanged事件的日誌記錄,但它有問題,並且不總是記錄。我正在尋找更好的解決方案,以適應所有更改(訪問可能不是必需的),只要我可以在應用程序中查看它就可以了。系統擁有自己的用戶帳戶,但使用系統用戶帳戶應該沒問題。你喜歡多解釋一下自己還是把我和某些東西聯繫起來? – Malfist 2010-07-01 20:45:05

+0

觸發器可能在你的情況下工作得很好。這個應用程序是否支持SQL Server?您甚至可以創建XSD數據集來映射單個[tableName] _changes表,因此您可以輕鬆地將更改的數據拖到您的應用程序,審計頁面或任何其他位置。 – 2010-07-01 21:02:55