powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Ведение логов изменений таблиц
10 сообщений из 10, страница 1 из 1
Ведение логов изменений таблиц
    #32077262
Serge N
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть такая задача:
Нужно создать таблицу с полями

- Время
- Пользователь
- Действие (Update, Delete)
- Таблица
- Данные записи до изменения (BLOB)

Далее на таблицы, для которых нужно вести логи, навешивается триггер (ON DELETE, UPDATE), который в таблицу-лог будет писать записи.

Все понятно, за исключением того, как засунуть из триггера в BLOB закодированную запись, чтобы потом можно было ее раскодировать.
Нет ли стандартных пакетов для этого. На чем лучше писать такой триггер или хранимую процедуру? На PL\SQL или Java? Или может есть какое-нибудь другое решение, которое позволит вести лог изменений данных в одном месте и затем просматривать их историю.
...
Рейтинг: 0 / 0
Ведение логов изменений таблиц
    #32077266
noname_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DBMS_LOB
...
Рейтинг: 0 / 0
Ведение логов изменений таблиц
    #32077268
noname_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Писать лучше на PL/SQL, потому что Жаба тормозит и глючит.
...
Рейтинг: 0 / 0
Ведение логов изменений таблиц
    #32079642
Serge N
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Еще одно условие, про которое я забыл написать - нужно, чтобы триггер вызывал хранимую процедуру, а та уже писала в лог-таблицу.
Эта процедура должна вызываться из нескольких триггеров, навешенных на несколько таблиц.
Всвязи с этим возникает несколько вопросов:

- как в хранимую процедуру из триггера передать меняющуюся запись.
Из самого триггера к полям можно обратиться как :old.fieldname
Но как сделать так, чтобы в хранимую процедуру можно было передать
произвольную запись, а потом в процедуре ее считать? Насколько я понял по документации, использовать VARRAy для этого нельзя, т.к. у массива все элементы могут быть только одного типа.

- по всей видимости нужно в процедуру передать еще и названия полей помимо их значений. Как это сделать? По всей видимости используя VARRAY?

- как закодировать произвольную запись, переданную в хранимую процедуру, которая может содержать поля любого типа (в том числе и BLOB) в текст, сохраняемый в BLOB-поле?
Причем так, чтобы потом можно было восстановить сохраненную запись?
...
Рейтинг: 0 / 0
Ведение логов изменений таблиц
    #32079994
MCC6011
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А почему Вы не хотите воспользоваться стандартными средствами аудита Oracle и/или стандартным пакетом DBMS_FGA?
...
Рейтинг: 0 / 0
Ведение логов изменений таблиц
    #32080007
Serge N
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я не слишком хорошо знаком со стандартными средствами аудита.
Не подскажете, можно ли включив аудит на таблицу, получить тот же результат. Т.е. иметь возможность просмотреть всю историю изменений каждой записи (в том числе и уже удаленных), кто эти изменения делал и просмотреть любую запись в том виде, в каком она была в любой момент времени?

Если это возможно, где об этом можно почитать? Был бы очень признателен за пример.
...
Рейтинг: 0 / 0
Ведение логов изменений таблиц
    #32080027
MCC6011
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Источники обычные

Oracle9i SQL Reference
Oracle9i Supplied PL/SQL Packages and Types Reference
Oracle9i Database Reference
Oracle9i Database Administrator’s Guide

Стандартный аудит выглядит примерно так:

Auditing Inserts and Updates on a Table:

Код: plaintext
AUDIT INSERT, UPDATE ON oe.customers;


А дальше информация хранится в наборе views, like

DBA_AUDIT_TRAIL
USER_AUDIT_TRAIL

Подробнее лучше Вам почитать самому.

Только не забывайте, что любой Аудит сильно влияет на производительность

Удачи
...
Рейтинг: 0 / 0
Ведение логов изменений таблиц
    #32080047
Serge N
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я попробовал сделать так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
SQL> create table ok (frog char( 10 ));
Table created

SQL> AUDIT INSERT, DELETE, UPDATE ON ok;
Audit succeeded

SQL> insert into ok values ('a');
 1  row inserted

SQL> insert into ok values ('b');
 1  row inserted

SQL> insert into ok values ('c');
 1  row inserted

SQL> delete from ok;
 3  rows deleted

SQL> select count(*) from USER_AUDIT_TRAIL;

  COUNT(*)
 ----------
 
          0 

SQL> 


Что неправильно? Почему в таблице аудита пусто?
...
Рейтинг: 0 / 0
Ведение логов изменений таблиц
    #32080493
.dba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а параметер audit_trail на уровне инстанса установлен?
...
Рейтинг: 0 / 0
Ведение логов изменений таблиц
    #32081192
Serge N
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, действительно, audit_trail был NULL

В документации по Oracle 8.1.6 Auditing Database Use
говорится:


The audit trail does not store information about any data values that might be involved in the audited statement. For example, old and new data values of updated rows are not stored when an UPDATE statement is audited. However, this specialized type of auditing can be performed on DML statements involving tables by using database triggers. For examples of trigger usage for this specialized type of auditing, see "Auditing Through Database Triggers".


То есть используя средства аудита Oracle нельзя сохранять значения, вовлеченные в отслеживаемые SQL-выражения. Для этого нужно писать триггеры :(
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Ведение логов изменений таблиц
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]