написание записей аудита до и после значений - PullRequest
0 голосов
/ 06 октября 2010

В настоящее время я использую SqlDataSource в ASP.NET/C#, чтобы позволить пользователям вставлять, удалять и обновлять записи в таблице / сетке. Каждое событие должно быть записано в таблицу аудита.

Я легко реализовал вставку и удаление - при вставке проверяемой основной информацией являются только значения параметров запроса вставки (e.Command.Parameters [0] .Value.ToString () и т. Д.), И удаление в значительной степени то же самое (просто получение идентификатора в запросе на удаление).

Но при обновлении мне нужно регистрировать, какие поля были изменены, а также их старые значения. Как бы я это сделал? В качестве примера, вот код для вставки:

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 ]

1 голос
/ 06 октября 2010

Вы можете сэкономить много головной боли (но не пространства БД), если вы отслеживаете текущее состояние в своем журнале аудита вместо предыдущих значений.Когда вы вставляете, бросьте исходные значения в таблицу аудита.Затем при обновлении добавьте недавно обновленные значения (независимо от того, изменились они или нет) в журнал аудита.Отсюда вы можете вернуться к любой предыдущей версии, и вам не нужно добавлять логику сравнения для аудита.

1 голос
/ 06 октября 2010

Почему бы не использовать триггеры SQL?

...