2011-08-22 58 views
2

我有一個挑戰,即需要審覈MVC應用程序用戶所做的數據更改。審覈在MVC和實體框架下的更改(使用sprocs)

審計創建和刪除記錄很容易。

更新被證明是問題所在。

我正在尋找一種方法來自動執行此操作,但是我遇到的問題是應用程序使用存儲過程來恢復EF「複雜類型」。

這些被用來構建一個視圖模型,並且在回發之後,控制器從視圖傳回的表單值中接收一個新的視圖模型。因此原始值不再可用。

有沒有人有一個安全的方式來保持原始值的任何建議,以便他們可以與更新值進行比較,以便更改可以存儲? (我很欣賞我可以回到數據庫中,但效率不高,我將不得不保留所有參數以重新創建相同的調用,並找到一種方法來自動執行該部分過程)。

回答

0

您是否使用INSERTED和DELETED表嘗試了Audit Trigger? http://weblogs.asp.net/jgalloway/archive/2008/01/27/adding-simple-trigger-based-auditing-to-your-sql-server-database.aspx

OR

,在插入存儲過程,刪除,更新,你可以使用FOR XML AUTO。獲取記錄的XML並將其添加到審計表。 http://www.a2zdotnet.com/View.aspx?Id=71

UPDATE T-SQL示例

BEGIN 
-- these tables would be in your database 
DECLARE @table TABLE(ID INT IDENTITY(1,1) PRIMARY KEY, STR VARCHAR(10), DT DATETIME) 
DECLARE @audit_table TABLE(AuditXML XML, Type VARCHAR(10), Time DATETIME) 
-- this is defined at the top of your stored procedure 
DECLARE @temp_table TABLE(PK INT) 
-- your stored procedure will add an OUTPUT to the temp table 
INSERT INTO @table 
    OUTPUT inserted.ID INTO @temp_table 
    VALUES ('test1', GetDate()), 
      ('test2', GetDate() + 2) 
-- at the end of your stored procedure update your audit table 
INSERT INTO @audit_table 
    VALUES(
     (
      SELECT * 
       FROM @table 
       WHERE ID IN (SELECT PK FROM @temp_table) 
       FOR XML AUTO 
     ), 
     'INSERTION', 
     GETDATE() 
    ) 
-- your audit table will have the record data 
SELECT * FROM @audit_table 
END 

在上面的例子中,你可以做temp_table表的克隆(具有所有列的表),並插入了OUTPUT子句中使用。 * INTO @temp_table,這將避免必須在獲取FOR XML AUTO之前重新選擇記錄。另外請注意,對於執行DELETE的存儲過程,您將在OUTPUT中使用DELETED。*而不是INSERTED。*。

+0

在我們的環境中,觸發器是不允許所以對於XML聽起來像一個選項,遺憾的是本文沒有詳細說明如何使用它進行審計 –

+0

@CD史密斯 - 我用你的例子更新了我的答案。 –

0

如果使用SQL Server,我建議您查看Change Data Capture(CDC)。

這是一個開箱即用的解決方案,用於審覈應用程序的基礎表更改,它的設置相對簡單,因此不需要您必須維護的自定義解決方案。

如果您有任何支持您的站點的應用程序,它們也將被覆蓋,並且還可以審計對數據庫直接進行的任何更改,例如運行腳本的DBA。

由於您的asp.net應用程序可能在一個特定帳戶下運行,因此您可能需要添加其他跟蹤信息來捕獲進行更改的用戶。幸運的是,這也相對簡單。下面Stack Overflow question介紹使用ObjectStateManager