Как войти в базу данных Oracle?

меня интересует, какие методы ведения журнала часто встречаются в базе данных Oracle. Наш метод заключается в следующем:

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

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

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

какие еще существуют возможности? Какие инструменты можно использовать для решения этой проблемы?

Я знаю только log4plsql. Какие плюсы/минусы этого инструмента?

Edit: на основе ответа Брайана я нашел следующее ссылка это объясняет стандартный и мелкозернистый аудит.

5 ответов


похоже, что вы после "аудита". Oracle имеет встроенную функцию под названием Fine Grain Auditing (FGA). В двух словах вы можете проверить все или конкретные условия. Что действительно здорово, так это то, что вы можете "аудит" выбирает, а также транзакции. Простая команда для начала аудита:

audit UPDATE on SCOTT.EMP by access;

подумайте об этом как о "триггере" для операторов select. Например, вы создаете политики:

begin
   dbms_fga.add_policy (
      object_schema=>'BANK',
      object_name=>'ACCOUNTS',
      policy_name=>'ACCOUNTS_ACCESS'
  );
end;

после определения политики, когда пользователь запрашивает таблица в обычном порядке, следующим образом:

select * from bank.accounts; 

аудиторский след записывает это действие. Вы можете увидеть след, выдав:

select timestamp, 
   db_user,
   os_user,
   object_schema,
   object_name,
   sql_text
from dba_fga_audit_trail;

TIMESTAMP DB_USER OS_USER OBJECT_ OBJECT_N SQL_TEXT
--------- ------- ------- ------- -------- ----------------------
22-OCT-08 BANK    ananda  BANK    ACCOUNTS select * from accounts

судя по вашему описанию, мне интересно, действительно ли вам нужен не механизм регистрации, а скорее какая-то историческая ценность какой-то таблицы. Если это так, то, возможно, вам лучше использовать какой-то временный дизайн базы данных (используя поля VALID_FROM и VALID_TO). Вы можете отслеживать изменения в базе данных с помощью Oracle LogMiner инструменты.

Что касается ваших сценариев, я бы предпочел сохранить данные об изменениях в такой схеме :

+----------------------------------------------------------------------------+
| Column Name         | Function                                             |
+----------------------------------------------------------------------------+
| Id                  | PRIMARY_KEY value of the SOURCE table                |
| TimeStamp           | Time stamp of the action                             |
| User                | User who make the action                             |
| ActionType          | INSERT, UPDATE, or DELETE                            |
| OldValues           | All fields value from source table, seperated by '|' |
| Newvalues           | All fields value from source table, seperated by '|' |
+----------------------------------------------------------------------------+

С помощью этого типа таблицы журналов вы можете легко определить:

  • историческое изменение действия конкретной записи (с помощью Id)
  • состояние конкретной записи в какой-то момент времени

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


в аналогичном вопросе (Как провести аудит активности базы данных без проблем с производительностью и масштабируемостью?) в принятом ответе упоминается мониторинг трафика базы данных с использованием сниффера сетевого трафика в качестве интересной альтернативы.


log4plsql-это совершенно другое, его для регистрации отладочной информации из PL / SQL

для того, что вы хотите, вам нужно либо.

  1. настройки триггера
  2. Настройка интерфейса PL/SQL вокруг таблиц, операции CRUD происходят через этот интерфейс, интерфейс обеспечивает обновление таблиц журнала.
  3. интерфейс настройки в вашем слое приложения, как и в интерфейсе PL/SQL, просто выше.
  4. Oracle 11g содержит версионные таблицы, I не пользовались вообще, так что можете не комментировать.

Если вам просто интересно узнать, как выглядели данные в недавнем прошлом, вы можете просто использовать функциональность запроса flashback Oracles для запроса данных за определенное время в прошлом. Как далеко в прошлом зависит от того, сколько дискового пространства у вас есть и сколько активности базы данных. Светлая сторона этого решения заключается в том, что новые столбцы автоматически добавляются. Недостатком является то, что вы не можете Flashback запросить прошлые операции ddl.