Аудит каждой вставленной строки в триггере

Я пытаюсь вести историю аудита, добавляя триггеры в свои таблицы и вставляя строки в свою таблицу аудита. У меня есть хранимая процедура, которая немного упрощает вставку, поскольку экономит код; Мне не нужно записывать весь оператор вставки, вместо этого я выполняю хранимую процедуру с несколькими параметрами столбцов, которые я хочу вставить.

Я не уверен, как выполнить хранимую процедуру для каждой из строк в «вставленной» таблице. Я думаю, может быть, мне нужно использовать курсор, но я не уверен. Я никогда раньше не пользовался курсором.

Поскольку это аудит, мне нужно будет сравнить значение для каждого старого столбца с новым, чтобы увидеть, изменилось ли оно. Если он изменится, я выполню хранимую процедуру, которая добавит строку в мою таблицу аудита.

Есть предположения?


person Jeff Stock    schedule 02.03.2009    source источник
comment
Какую версию SQL Server вы используете? В SQL 2K8 есть несколько встроенных инструментов аудита, которые должны быть более удобными в сопровождении, чем то, что вы создаете.   -  person JohnFx    schedule 18.03.2009


Ответы (4)


Я бы променял место на время и не стал бы сравнивать. Просто поместите новые значения в таблицу аудита при вставке/обновлении. Диск дешевый.

Кроме того, я не уверен, что хранимая процедура покупает вас. Разве вы не можете сделать что-то простое в триггере, например:

insert into dbo.mytable_audit
    (select *, getdate(), getdate(), 'create' from inserted)

Когда триггер запускается при вставке, и вы добавляете поля времени создания, времени последнего обновления и типа модификации. Для обновления это немного сложнее, так как вам нужно указать именованные параметры, поскольку созданное время не должно обновляться.

insert into dbo.mytable_audit (col1, col2, ...., last_updated, modification)
     (select *, getdate(), 'update' from inserted)

Кроме того, вы планируете проводить аудит только успехов или неудач? Если вы хотите проверить сбои, вам понадобится что-то кроме триггеров, я думаю, поскольку триггер не сработает, если транзакция откатится, и у вас не будет статуса транзакции, если триггер сработает первым.

На самом деле я перенес свой аудит на уровень доступа к данным и теперь делаю это в коде. Это упрощает аудит как успехов, так и неудач, и (с использованием отражения) довольно легко копировать поля в объект аудита. Еще одна вещь, которую он позволяет мне сделать, — это дать пользовательский контекст, поскольку я не даю фактических разрешений пользователя для базы данных и запускаю все запросы, используя учетную запись службы.

person tvanfosson    schedule 02.03.2009
comment
Я согласен. Диск дешевый. Просто сохраняйте новые (вставленные) значения каждый раз. Старые значения будут в предыдущей строке таблицы аудита. - person MikeW; 03.03.2009

Если ваша база данных должна масштабироваться за пределы нескольких пользователей, это станет очень дорогим. Я бы порекомендовал изучить сторонние инструменты аудита баз данных.

person Hawk Kroeger    schedule 02.03.2009

Уже есть встроенная функция UPDATE(), которая сообщает вам, изменился ли столбец (но это касается всего набора вставленных строк).

Вы можете ознакомиться с некоторыми методами в триггерах AutoAudit Пола Нильсена, которые генерируются кодом.

Что он делает, так это проверяет оба:

IF UPDATE(<column_name>)
INSERT Audit (...)
SELECT ...
FROM Inserted
JOIN Deleted
    ON Inserted.KeyField = Deleted.KeyField -- (AutoAudit does not support multi-column primary keys, but the technique can be done manually)
AND NOT (Inserted.<column_name> = Deleted.<column_name> OR COALESCE(Inserted.<column_name>, Deleted.<column_name>) IS NULL)

Но он проверяет каждое изменение столбца как отдельную строку. Я использую его для аудита изменений в таблицах конфигурации. В настоящее время я не использую его для аудита тяжелых таблиц изменений. (Но в большинстве транзакционных систем, которые я разработал, строки в таблицах с высокой активностью обычно неизменяемы, у вас не так много UPDATE, только много INSERT, так что вам даже не понадобится такой аудит). Например, заказы или записи в бухгалтерской книге никогда не меняются, а тележки для покупок одноразовые — ни один из них не будет иметь такой аудит. В таблицах изменений с небольшим объемом, таких как клиент, вы можете использовать этот вид аудита.

person Cade Roux    schedule 02.03.2009

Джефф, я согласен с Зодеусом... хороший вариант - использовать 3-й инструмент. Я использовал веб-инструмент auditdatabase (БЕСПЛАТНО), который генерирует триггеры аудита (вам не нужно писать ни одной строки кода TSQL)

Еще одним хорошим инструментом является Apex SQL Audit, но он платный.

Надеюсь, это поможет вам, Ф. О'Нил.

person Community    schedule 21.03.2009
comment
Сайт www.auditdatabase.com. - person ; 30.03.2009