Как войти в базу данных 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
для того, что вы хотите, вам нужно либо.
- настройки триггера
- Настройка интерфейса PL/SQL вокруг таблиц, операции CRUD происходят через этот интерфейс, интерфейс обеспечивает обновление таблиц журнала.
- интерфейс настройки в вашем слое приложения, как и в интерфейсе PL/SQL, просто выше.
- Oracle 11g содержит версионные таблицы, I не пользовались вообще, так что можете не комментировать.
Если вам просто интересно узнать, как выглядели данные в недавнем прошлом, вы можете просто использовать функциональность запроса flashback Oracles для запроса данных за определенное время в прошлом. Как далеко в прошлом зависит от того, сколько дискового пространства у вас есть и сколько активности базы данных. Светлая сторона этого решения заключается в том, что новые столбцы автоматически добавляются. Недостатком является то, что вы не можете Flashback запросить прошлые операции ddl.