Как войти в базу данных Oracle? - PullRequest
6 голосов
/ 12 октября 2008

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

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

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

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

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

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

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

Ответы [ 5 ]

10 голосов
/ 13 октября 2008

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

audit UPDATE on SCOTT.EMP by access;

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

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
2 голосов
/ 13 октября 2008

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

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

+----------------------------------------------------------------------------+
| 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 '|' |
+----------------------------------------------------------------------------+

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

  • Действие исторического изменения конкретной записи (с использованием идентификатора)
  • Состояние конкретной записи в определенный момент времени

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

1 голос
/ 31 декабря 2008

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

0 голосов
/ 13 октября 2008

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

0 голосов
/ 13 октября 2008

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

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

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