2010-10-06 50 views
0

我目前在ASP.NET/C#中使用SqlDataSource來讓用戶插入,刪除和更新表格/ gridview中的條目。每個事件都需要寫入審計表。編寫前後值的審計記錄

我很容易實現插入和刪除 - 插入時,審計的主要信息只是插入查詢(e.Command.Parameters [0] .Value.ToString()等)的參數值,並且刪除很漂亮非常相似(只需在刪除查詢中獲取ID)。

但隨着更新,我需要記錄哪些字段發生了變化,以及它們的舊值。我將如何做到這一點?作爲一個例子,這裏是插入的代碼:

protected void SqlDataSource1_Inserting(object sender, SqlDataSourceCommandEventArgs e) 
{ 
    string fields = e.Command.Parameters[0].Value.ToString() + "," + e.Command.Parameters[1].Value.ToString() + "," + e.Command.Parameters[2].Value.ToString() + "," + e.Command.Parameters[3].Value.ToString() + "," + e.Command.Parameters[4].Value.ToString(); 
    System.Security.Principal.WindowsPrincipal p = System.Threading.Thread.CurrentPrincipal as System.Security.Principal.WindowsPrincipal; 
    string[] namearray = p.Identity.Name.Split('\\'); 
    string name = namearray[1]; 
    string queryString = "INSERT INTO Audit (source, action, item, userid, timestamp) VALUES (@source, @action, @item, @userid, @timestamp)"; 
    using (SqlConnection connection = new SqlConnection("constring - deleted for privacy ")) 
    { 
     SqlCommand command = new SqlCommand(queryString, connection); 
     command.Parameters.AddWithValue("@source", "Nominal"); 
     command.Parameters.AddWithValue("@action", "Insert"); 
     command.Parameters.AddWithValue("@item", fields); 
     command.Parameters.AddWithValue("@userid", name); 
     command.Parameters.AddWithValue("@timestamp", DateTime.Now); 
     connection.Open(); 
     try 
     { 
      command.ExecuteNonQuery(); 
     } 
     catch (Exception x) 
     { 
      Response.Write(x); 
     } 
     finally 
     { 
      connection.Close(); 
     } 
    } 

}

如何才能做到這一點?

回答

1

爲什麼不使用SQL觸發器?

+0

這也是一個很好的觀點。無論你最終做什麼,都可以通過觸發器來實現邏輯。你必須在你的主表中存儲一個「最後由用戶ID改變」的列,這是我所知道的唯一缺點。 – Kendrick 2010-10-06 15:38:38

1

如果您跟蹤以前值的審覈日誌insead中的當前狀態,您可以節省很多頭痛(但不是數據庫空間)。插入時,將原始值放入您的審計表中。然後,當您更新時,在您的審計日誌中拋出新更新的值(無論它們是否已更改)。您可以從這裏回滾到任何以前的版本,並且不必爲審計添加任何比較邏輯。

+0

問題是,表中包含很多已經存在的條目,因此不會有任何審覈條目。另外我被要求只添加更新的字段。 – Chris 2010-10-06 15:29:53

+0

如果您在事後添加審計,請運行查詢以使用當前狀態信息填充您的審計表,並從此處進行審計。這真的取決於問題是什麼。如果它是一張巨大的桌子,而且你需要整合空間,那麼這可能是一個有效的請求。如果您不必擔心回滾或以其他方式在表格中以編程方式工作,那麼這也不是什麼問題。如果您必須回滾,生成統計數據/分析,或以其他方式「執行」您的審計日誌,那麼更多的重複信息確實是更好的方法。 – Kendrick 2010-10-06 15:36:08