таблица аудита базы данных - PullRequest
2 голосов
/ 10 ноября 2009

У меня есть существующее приложение, с которым я работаю, и клиент определил структуру таблицы, которую он хотел бы использовать для журнала аудита. Имеет следующие столбцы:

storeNo 
timeChanged
user 
tableChanged 
fieldChanged 
BeforeValue 
AfterValue

Обычно у меня просто есть простые столбцы аудита в каждой таблице, которые предоставляют значение userChanged и timeChanged. Приложение, которое будет записывать в эти таблицы, является java-приложением, и вызовы выполняются через jdbc в базе данных oracle. Вопрос, который у меня есть, заключается в том, каков наилучший способ получить значения до / после. Я ненавижу сравнивать объекты, чтобы увидеть, какие изменения были внесены для заполнения этой таблицы, это не будет эффективным. Если в одном обновлении изменяется несколько столбцов, то в этой новой таблице будет несколько записей. Или есть способ сделать это в оракуле? Что другие делали в прошлом, чтобы отслеживать не только изменения, но и измененные значения?

Ответы [ 4 ]

10 голосов
/ 10 ноября 2009

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

http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:59412348055

2 голосов
/ 10 ноября 2009

Если вы используете Oracle 10g или новее, вы можете использовать встроенные функции аудита. Вы заплатили хорошие деньги за лицензию, могли бы также использовать ее.

Подробнее на http://www.oracle.com/technology/pub/articles/10gdba/week10_10gdba.html

2 голосов
/ 10 ноября 2009

"клиент определил структуру таблицы, которую он хотел бы для журнала аудита"

Ужасные слова.

Вот как бы вы реализовали такую ​​вещь:

create or replace trigger emp_bur before insert on emp for each row
begin
    if :new.ename = :old.ename then
        insert_audit_record('EMP', 'ENAME', :old.ename, :new.ename);
    end if;
    if :new.sal = :old.sal then
        insert_audit_record('EMP', 'SAL', :old.sal, :new.sal);
    end if;
    if :new.deptno = :old.deptno then
        insert_audit_record('EMP', 'DEPTNO', :old.deptno, :new.deptno);
    end if;
end;
/

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

  1. Имеет значительные накладные расходы: одно обновление, которое касается десяти поле сгенерирует десять вставок заявления.
  2. BeforeValue и AfterValue столбцы становятся проблематичными, когда мы должны обрабатывать разные типы данных - даже даты и метки времени становятся интересные, не говоря уже о CLOBs.
  3. Трудно восстановить государство записи в определенный момент времени. Мы надо начинать с самого раннего версия записи и применить последующие изменения постепенно.
  4. Не сразу очевидно, как этот подход будет обрабатывать вставку и УДАЛИТЬ операторы.

Теперь ни одно из этих возражений не является проблемой, если основное требование клиента состоит в том, чтобы отслеживать изменения в нескольких чувствительных столбцах: EMPLOYEES.SALARY, CREDIT_CARDS.LIMIT и т. Д. Но если требуется отслеживать изменения в каждой таблице, лучше использовать подход «целая запись»: просто вставьте одну запись аудита для каждой строки, затронутой DML.

0 голосов
/ 10 ноября 2009

Я тоже буду о триггерах.

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

  1. начать транзакцию
  2. ВЫБРАТЬ ДЛЯ ОБНОВЛЕНИЯ записи, подлежащей изменению
  3. для каждого поля, подлежащего изменению, выбрать старое значение из записи и новое значение из логики программы
  4. для каждого поля, подлежащего изменению, написать запись аудита
  5. обновить запись
  6. завершить транзакцию

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

...