Аудит данных в Oracle на основе пакетных переменных и триггеров

В пакеты Oracle можно добавлять переменные. Эти переменные имеют свои значения для каждой сессии. Такое свойство позволяет организовать аудит — лог записей о том кто и когда менял данные в таблицах. Общий алгоритм такой:

  • Создаётся пакет с переменными.
  • После соединения программа записывает в эти переменные данные о пользователе: идентификатор пользователя, открытый модуль и всё что может понадобится для аудита.
  • На таблицы помещаются триггеры которые используют переменные из пакета аудита и записывают информацию о модификации данных в отдельную таблицу.

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

Пакет может выглядеть примерно так

CREATE OR REPLACE PACKAGE AUD.MY_AUDIT IS
  curr_user       core.users%rowtype;
  curr_module     core.modules%rowtype;

  -- Установка текущего пользователя
  procedure SetCurrentUser
    (currentUserID in core.users.rid%type);

  -- Установка текущего модуля
  procedure SetCurrentModule
    (currentModuleID in core.modules.rid%type);

  -- Одна процедура для установки пользователя и модуля
  procedure SetCurrentAuditParams
    (currentUserID in core.users.rid%type,
     currentModuleID in core.modules.rid%type);

  -- Получение информации о текущем пользователе
  function GetCurrentUser
    return core.users%rowtype;

  -- Получение информации о текущем модуле
  function GetCurrentModule
    return core.modules%rowtype;

  -- Функции для отдельных полей могут использоваться в запросах или представлениях
  function current_user_name return core.users.name%type;

end MY_AUDIT;
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
27
28
29

Недостаток такого подхода — исключение ORA-04068: существующее состояние пакетов было сброшено. Оно происходит если в сессии используется какой-либо пакет и во время работы сессии этот пакет перекомпилируется. Такая ситуация возникакет, например, при обновлении БД, без отключения клиентов. После исключения все переменные всех пакетов, в том числе в пакете аудита, сбрасываются и регистрацию сессии нужно производить заново.

Последниее изменение: 24.08.2023, 06:42:55