|
|
|
Ведение логов изменений таблиц
|
|||
|---|---|---|---|
|
#18+
Есть такая задача: Нужно создать таблицу с полями - Время - Пользователь - Действие (Update, Delete) - Таблица - Данные записи до изменения (BLOB) Далее на таблицы, для которых нужно вести логи, навешивается триггер (ON DELETE, UPDATE), который в таблицу-лог будет писать записи. Все понятно, за исключением того, как засунуть из триггера в BLOB закодированную запись, чтобы потом можно было ее раскодировать. Нет ли стандартных пакетов для этого. На чем лучше писать такой триггер или хранимую процедуру? На PL\SQL или Java? Или может есть какое-нибудь другое решение, которое позволит вести лог изменений данных в одном месте и затем просматривать их историю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2002, 11:41 |
|
||
|
Ведение логов изменений таблиц
|
|||
|---|---|---|---|
|
#18+
DBMS_LOB ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2002, 11:45 |
|
||
|
Ведение логов изменений таблиц
|
|||
|---|---|---|---|
|
#18+
Писать лучше на PL/SQL, потому что Жаба тормозит и глючит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2002, 11:48 |
|
||
|
Ведение логов изменений таблиц
|
|||
|---|---|---|---|
|
#18+
Еще одно условие, про которое я забыл написать - нужно, чтобы триггер вызывал хранимую процедуру, а та уже писала в лог-таблицу. Эта процедура должна вызываться из нескольких триггеров, навешенных на несколько таблиц. Всвязи с этим возникает несколько вопросов: - как в хранимую процедуру из триггера передать меняющуюся запись. Из самого триггера к полям можно обратиться как :old.fieldname Но как сделать так, чтобы в хранимую процедуру можно было передать произвольную запись, а потом в процедуре ее считать? Насколько я понял по документации, использовать VARRAy для этого нельзя, т.к. у массива все элементы могут быть только одного типа. - по всей видимости нужно в процедуру передать еще и названия полей помимо их значений. Как это сделать? По всей видимости используя VARRAY? - как закодировать произвольную запись, переданную в хранимую процедуру, которая может содержать поля любого типа (в том числе и BLOB) в текст, сохраняемый в BLOB-поле? Причем так, чтобы потом можно было восстановить сохраненную запись? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2002, 10:06 |
|
||
|
Ведение логов изменений таблиц
|
|||
|---|---|---|---|
|
#18+
А почему Вы не хотите воспользоваться стандартными средствами аудита Oracle и/или стандартным пакетом DBMS_FGA? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2002, 16:00 |
|
||
|
Ведение логов изменений таблиц
|
|||
|---|---|---|---|
|
#18+
Я не слишком хорошо знаком со стандартными средствами аудита. Не подскажете, можно ли включив аудит на таблицу, получить тот же результат. Т.е. иметь возможность просмотреть всю историю изменений каждой записи (в том числе и уже удаленных), кто эти изменения делал и просмотреть любую запись в том виде, в каком она была в любой момент времени? Если это возможно, где об этом можно почитать? Был бы очень признателен за пример. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2002, 16:19 |
|
||
|
Ведение логов изменений таблиц
|
|||
|---|---|---|---|
|
#18+
Источники обычные 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 А дальше информация хранится в наборе views, like DBA_AUDIT_TRAIL USER_AUDIT_TRAIL Подробнее лучше Вам почитать самому. Только не забывайте, что любой Аудит сильно влияет на производительность Удачи ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2002, 16:36 |
|
||
|
Ведение логов изменений таблиц
|
|||
|---|---|---|---|
|
#18+
Я попробовал сделать так: Код: 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. Что неправильно? Почему в таблице аудита пусто? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2002, 16:59 |
|
||
|
Ведение логов изменений таблиц
|
|||
|---|---|---|---|
|
#18+
а параметер audit_trail на уровне инстанса установлен? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2002, 15:09 |
|
||
|
Ведение логов изменений таблиц
|
|||
|---|---|---|---|
|
#18+
Да, действительно, 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-выражения. Для этого нужно писать триггеры :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2002, 15:44 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=32081192&tid=1992420]: |
0ms |
get settings: |
11ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
143ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
72ms |
get tp. blocked users: |
1ms |
| others: | 249ms |
| total: | 513ms |

| 0 / 0 |
