C# 编写前后价值的审计记录

C# 编写前后价值的审计记录,c#,asp.net,sql,sqldatasource,auditing,C#,Asp.net,Sql,Sqldatasource,Auditing,我目前正在使用ASP.NET/C中的SqlDataSource来允许用户在表/网格视图中插入、删除和更新条目。每个事件都需要写入审计表 我已经很容易地实现了插入和删除-插入时,审计的主要信息只是插入查询的参数值(例如,Command.Parameters[0].Value.ToString()等),而删除几乎是一样的(只是在删除查询中获取ID) 但随着更新,我需要记录哪些字段被更改,以及它们的旧值。我该怎么做?例如,以下是插入的代码: protected void SqlDataSource1_

我目前正在使用ASP.NET/C中的SqlDataSource来允许用户在表/网格视图中插入、删除和更新条目。每个事件都需要写入审计表

我已经很容易地实现了插入和删除-插入时,审计的主要信息只是插入查询的参数值(例如,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();
        }
    }
}


如何做到这一点?

为什么不使用SQL触发器?

如果您在审计日志中跟踪当前状态并插入以前的值,则可以为自己节省很多麻烦(但不是数据库空间)。插入时,在审核表中抛出原始值。然后在更新时,将新更新的值(无论它们是否已更改)抛出到审核日志中。您可以从此处回滚到任何以前的版本,并且不必为审核添加任何比较逻辑。

问题是,该表包含许多已经存在的条目,因此不会有任何审核条目。另外,我被要求只添加更新的字段。如果您在事后添加审核,请运行一个查询,用当前状态信息填充审核表,并从此处开始审核。这真的取决于问题是什么。如果这是一个巨大的表,您需要整合空间,那么这可能是一个有效的请求。如果您不必担心回滚或以编程方式处理表,那么这也不是什么问题。如果您必须回滚、生成统计数据/分析或以其他方式“处理”您的审核日志,那么更多信息并进行一些复制确实是更好的方法。这也是一个很好的观点。您可以通过触发器实现逻辑,无论您最终以何种方式实现。您必须在主表中存储一个“lastchangedbyuserid”列,这样才能工作,这是我所知道的唯一缺点。