编写前后值的审计记录

时间:2010-10-06 15:21:28

标签: c# asp.net sql sqldatasource auditing

我目前正在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();
        }
    }

}

如何做到这一点?

2 个答案:

答案 0 :(得分:1)

为什么不使用SQL触发器?

答案 1 :(得分:1)

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