- Таблица
db_audit.ddl_objects
:- Доработать запрос
select * from db_audit.ddl_objects
, чтобы при отсутствии прав доступа к объектам не выдавал ошибку (частично исправлено) - Доработать
db_audit.ddl_objects
, чтобы корректно показывал дату создания и обновления дляCREATE VIEW
иCREATE OR REPLACE VIEW
. СCREATE [OR REPLACE] FUNCTION/PROCEDURE
уже сложнее, т.к. нужно ещё учитывать параметры функции.
- Доработать запрос
- В таблицу
db_audit.ddl_log
добавить колонкуclient_hostname
. В списке процессов (pg_stat_activity
) такая колонка есть. - В view
db_audit.ddl_start_log
добавить колонкуtransactions_delta
для отображения прошедшего времени между предыдущей и следующей транзакцией (transaction_start_at - lag(transaction_start_at) over () as transactions_delta
) - Сделать view
db_audit.ddl_objects_deleted
. Иногда нужно смотреть историю удалённых объектов. - Добавить автотесты!
- Подумать, как уменьшить кол-во строк, где
tag = 'REFRESH MATERIALIZED VIEW'
:select count(*), --179,180 count(*) filter (where tag = 'REFRESH MATERIALIZED VIEW') --67,132 from db_audit.ddl_log;
- Сделать отдельное расширение? См. https://edu.postgrespro.ru/dba2-13/dba2_15_admin_extensions.html
- ✔️ Исправить ошибку:
[0A000] ERROR: DROP INDEX CONCURRENTLY must be first action in transaction
- View
db_audit.ddl_objects
:- ✔️ Добавить колонку
transaction_id
.
- ✔️ Добавить колонку
- ✔️ Автоочистка
db_audit.ddl_log
:- ✔️ Команды с опцией
IF [NOT] EXISTS
(например,DROP TABLE IF EXISTS ...
), которые создают только 1 событиеddl_command_start
, не выполняются, т.к. объект уже [не] существует. В этом случае достаточно хранить только 1000 последних записей, остальные нужно удалять. В функцииdb_audit.ddl_command_start_log()
нужно добавить условие: еслиtop_queries
содержитIF [NOT] EXISTS
, то выполнять команду удаления. - ✔️ В триггерной функции
db_audit.ddl_command_end_log()
в SQL запрос автоочистки добавитьlimit 1000
в первый SELECT подзапрос
- ✔️ Команды с опцией