2010-10-06 54 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