Настройка протоколирования

Спецификация
         
< состояние протоколирования >::=
START|STOP|ENABLE|DISABLE|CLEAR
< имя события >::=
< идентификатор >
< объект протоколирования >::=
ON < идентификатор >
< субъект протоколирования >::=
FOR < имя пользователя >
< уровень протоколирования >::=
BY {SESSION | STATEMENT | ACCESS}
< условие протоколирования >::=
WHEN [NOT] SUCCESS
< параметр протоколирования >::=
SET {RECORDS | DAYS} LIMIT < целочисленный литерал >
Синтаксические правила
  1. Допустимые < имена событий > приведены в таблицах 8, 9, 10, 11 и 12.

  2. Допустимые типы < объектов протоколирования >:

    • USER < имя пользователя >;

    • USER < имя схемы >;

    • ROLE < имя роли >;

    • LEVEL {< имя уровня доступа > | < идентификатор уровня доступа >};

    • GROUP < имя группы >;

    • STATION < идентификатор станции >;

    • NODE < имя узла локальной сети >;

    • DEVICE < имя устройства >;

    • TABLE [< имя схемы >].< имя таблицы >;

    • VIEW [< имя схемы >].< имя представления >;

    • SYNONYM < имя синонима >;

    • EVENT < имя события >;

    • PROCEDURE < имя хранимой процедуры >;

    • TRIGGER < имя триггера >;

    • CURSOR < имя курсора >;

    • LOCK < системный идентификатор блокируемой таблицы >;

    • SEQUENCE < имя пользователя > < имя последовательности >;

    • CHARACTER SET < имя кодировки >;

    • TRANSLATION < имя правила трансляции >;

    • ALIAS < имя алиаса >.

Если конкретный < объект протоколирования > не указан, будет протоколироваться доступ ко всем объектам БД.

< Объект протоколирования > должен существовать на момент создания события протоколирования.

Общие правила
  1. В подсистеме аудита СУБД ЛИНТЕР предусмотрено четыре типа установок:

    • глобальные – установки, действующие для всех пользователей и объектов БД;

    • объектные – установки для конкретных объектов БД;

    • персональные – установки для конкретных пользователей БД;

    • локальные – установки между конкретными пользователями и конкретными объектами БД.

    Сначала проверяются глобальные установки, затем установки для конкретных объектов БД, затем установки для конкретных пользователей. После проверяются локальные установки.

    Если задана глобальная установка, то наличие установок для конкретных объектов БД уже не проверяется. В противном случае (если глобальная установка не задана) проверяется наличие установок для конкретных объектов БД.

    Если задана установка для конкретного объекта БД, то наличие установок для конкретных пользователей уже не проверяется. В противном случае (если установка для конкретного объекта БД не задана) проверяется наличие установок для конкретных пользователей.

    Локальные установки проверяются в любом случае (независимо от того заданы ли глобальные установки или установки для конкретных объектов/пользователей БД).

    Примеры:

    • AUDIT ENABLE SELECT; (глобальная установка);

    • AUDIT ENABLE SELECT ON AUTO; (объектная установка);

    • AUDIT ENABLE SELECT FOR SYS; (персональная установка);

    • AUDIT ENABLE SELECT ON AUTO FOR SYS; (локальная установка).

  2. Опция < состояние протоколирования >

    START

    Команда активизирует подсистему протоколирования.

    STOP

    Команда отключает подсистему протоколирования.

    ENABLE

    Команда разрешает протоколирование указанного события и должна выполняться при активной подсистеме протоколирования (после выполнения команды AUDIT START).

    Результаты выполнения команды:

    1. если < имя события > не задано, протоколируются все события;

    2. если < имя события >, < имя пользователя > и < объект протоколирования > не заданы, то изменяются глобальные установки;

    3. если задано < имя пользователя > или < объект протоколирования >, то изменяются персональные установки;

    4. если < имя события > задано без указания < условия протоколирования >, то устанавливается:

      • заданное < состояние протоколирования > (ENABLE);

      • протоколирование только неудачных событий (when not success).

    5. если < состояние протоколирования > не указывается, по умолчанию принимается BY STATEMENT;

    6. если задано только < состояние протоколирования > ENABLE, включается протоколирование сразу всех неуспешных системных событий.

    Пример.

    audit enable linter error;
             
    DISABLE

    Команда запрещает протоколирование указанного события.

    Если < имя события > не задано, запрещается протоколирование всех событий. Команда должна выполняться при активной подсистеме протоколирования (после выполнения команды AUDIT START). Если при этом не заданы < имя пользователя > и < объект протоколирования >, то изменяются глобальные установки.

    Если задано < имя пользователя >, то изменяются персональные установки. Если задан < объект протоколирования >, изменяются установки для конкретного объекта. Если заданы < имя пользователя > и < объект протоколирования >, изменяются локальные установки.

    В случае подачи команды audit disable < имя события > выполняются следующие действия:

    • если ранее < состояние протоколирования > не было установлено, то запрос игнорируется;

    • если < состояние протоколирования > ранее было установлено и в запросе не задано < условие протоколирования >, то отменяются ранее установленное < состояние протоколирования > и < условие протоколирования >;

    • если < состояние протоколирования > ранее было установлено и в запросе задано < условие протоколирования >, то ранее установленное < состояние протоколирования > не изменяется, а отменяется только ранее установленное < условие протоколирования > (если было задано).

    Если задано < состояние протоколирования > disable, отменяется протоколирование сразу всех системных событий.

    Пример.

    audit disable linter error;
             

    Примечание

    В текущей версии запрет протоколирования неудачно завершенных событий не поддерживается. Например, по команде audit disable create table when not success попытка создания таблицы протоколируется всегда (как при успешном завершении, так и при неуспешном).

    CLEAR

    Команда сбрасывает (очищает) изменения установок, выполненные командами AUDIT ENABLE и AUDIT DISABLE:

    • AUDIT CLEAR ... WHEN SUCCESS – очищает только «успешные» события;

    • AUDIT CLEAR ... WHEN NOT SUCCESS – очищает только «неуспешные» события;

    • AUDIT CLEAR ... – очищает все события.

  3. Опция < имя события >

    Имя события, для которого устанавливается протоколирование. Список поддерживаемых событий приведен в таблицах 8, 9, 10, 11 и 12. Если имя события явно не задано, устанавливается протоколирование для всех возможных событий.

    Примеры.

    audit enable create table;
    audit disable create view;
             
  4. Опция < объект протоколирования >

    Для событий группы "RESOURCE EVENTS" (кроме EXECUTE TRIGGER и EXECUTE PROCEDURE) в случае, если для них указан модификатор "ON < OBJECT >" выдаётся код завершения 2499 (Возможность еще не реализована).

    Нереализованные команды установки аудита для событий: "CREATE DEVICE", "ALTER DEVICE", "DROP DEVICE", "CREATE STATION", "ALTER STATION", "DROP STATION", "TRUNCATE TABLE". При попытке выполнения команды AUDIT для вышеуказанных событий будет выдан код завершения 99 (Операция не реализована).

  5. Опция < имя пользователя >

    Имя пользователя, чьи действия должны протоколироваться. Если указан конкретный пользователь, то событие возникает при условии, что текущий пользователь совпадает с < именем пользователя >. Если < имя пользователя > не задано, протоколироваться будут действия всех пользователей БД.

  6. Опция < уровень протоколирования >

    BY SESSION

    Событие протоколируется один раз для одного подключения (CONNECTION). При этом уровень протоколирования BY SESSION срабатывает только для установки для конкретного пользователя.

    Если уровень BY SESSION задан для глобальной установки, установки для конкретного объекта БД или локальной установки, он игнорируется.

    Примеры.

    AUDIT ENABLE BY SESSION; (игнорируется)
    AUDIT ENABLE FOR SYS BY SESSION; (срабатывает)
             
    BY STATEMENT

    Событие протоколируется один раз для каждой SQL-операции (режим по умолчанию).

    BY ACCESS

    Событие протоколируется для каждого обращения к данным.

  7. Опция < условие протоколирования >

    WHEN NOT SUCCESS

    Событие протоколируется только при неудачном завершении (режим по умолчанию).

    WHEN SUCCESS

    Событие протоколируется только в случае успешного завершения.

  8. Опция < параметры протоколирования >

    SET

    Устанавливает указанный < параметр протоколирования >:

    • RECORDS – максимальное количество записей в таблице $$$AUDIT. При исчерпании свободных записей новые записи размещаются на месте самых старых записей;

    • DAYS – указывает количество предшествующих текущей дате дней, в течение которых необходимо хранить записи протоколирования. Зарезервировано для дальнейшего использования.

    CANCEL

    Отменяет ранее установленные < параметры протоколирования >.

    Конструкция AUDIT CANCEL RECORDS LIMIT запрещена.

  9. События протоколируются в таблицы вида $$$AUDIT_N. где N - целое число. Синоним $$$AUDIT указывает на наполняемую в данный момент таблицу вида $$$AUDIT_N. Для каждой таблицы установлен лимит 1000000. При превышении лимита, заданного командой AUDIT SET RECORDS LIMIT <  новое значение  >;, происходит создание новой таблицы, а "старая" таблицы считается архивной копией. Если AUDIT SET RECORDS LIMIT делает лимит записей таблицы аудита меньшим, чем уже есть записей в этой таблице, то таблица с новым лимитом должна создаться в следующем кванте работы.

  10. Для очистки базы данных от накопленных архивных копий журнала предусмотрена процедура clear_old_audit, текст которой находится в файле audit_full_info.sql каталога системных словарей. Процедура вызывается с одним аргументом - числом последних таблиц аудита, которое будет оставлено в базе. При запуске процедуры без аргументов будет оставлено 10 таблиц. Если задан аргумент меньше 10, то он заменяется на 10. Процедура возвращает TRUE, если все запросы завершились без ошибок, иначе FALSE.

  11. Процедура SET_AUDIT_LAST устанавливает в качестве источника данных для представления AUDIT_EVENTS текущую таблицу, привязанную к синониму $$$AUDIT. Вызывается без аргументов. Возвращает TRUE при успешном выполнении всех запросов, FALSE в случае ошибок.

  12. Процедура SET_AUDIT_ALL устанавливает в качестве источника данных для представления AUDIT_EVENTS объединение по UNION ALL всех таблиц аудита, которые есть в базе (или нескольких последних, если задан аргумент - количество таблиц). Вызывается без аргументов или с одним числовым аргументом. Возвращает TRUE при успешном выполнении всех запросов, FALSE в случае ошибок. Если произошла замена таблицы аудита, то эту процедуру следует вызвать заново перед обращением к представлению AUDIT_EVENTS.