0

現在、ASP.NET/C# で SqlDataSource を使用して、ユーザーがテーブル/グリッドビューのエントリを挿入、削除、更新できるようにしています。すべてのイベントを監査テーブルに書き込む必要があります。

挿入と削除を簡単に実装しました-挿入時に監査される主な情報は、挿入クエリのパラメーター値(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();
        }
    }

}

これはどのように行うことができますか?

4

2 に答える 2

1

SQLトリガーを使用してみませんか?

于 2010-10-06T15:27:51.017 に答える
1

以前の値の内部にある監査ログで現在の状態を追跡すると、多くの頭痛の種を節約できます(ただし、DBスペースは節約できません)。挿入するときは、元の値を監査テーブルにスローします。次に、更新するときに、新しく更新された値(変更されているかどうかに関係なく)を監査ログにスローします。ここから以前のバージョンにロールバックでき、監査のために比較ロジックを追加する必要はありません。

于 2010-10-06T15:27:59.283 に答える