pghist.hist_enable(schema, table_name, master_table_schema, master_table_name, columns_excluded)
Процедура включает ведение истории изменений для указанной таблицы, создает таблицу истории, триггеры и функции получения данных
Параметры:
schema | - | схема таблицы (необязательный) | |
table_name | - | имя таблицы | |
master_table_schema | - | схема мастер-таблицы (необязательный) | |
master_table_name | - | имя мастер-таблицы (необязательный) | |
columns_excluded | - | исключенные столбцы (необязательный) |
Примеры вызова:
call pghist.hist_enable('document'); call pghist.hist_enable('example', 'invoice'); call pghist.hist_enable('example', 'invoice_product', 'example', 'invoice'); call pghist.hist_enable('orm', 'myclass', columns_excluded => array['inserted_at','updated_at']);
[schema].[table]_hist
Представление содержит список изменений по строкам, создается при включении ведения истории.
Сортируется по первым двум столбцам, что обеспечивает хронологию по времени
Столбцы:
hist_statement_num | - | глобальный номер SQL-выражения | |
hist_row_num | - | номер строки в наборе данных, который изменяет SQL-выражения | |
hist_timestamp | - | дата-время начала выполнения SQL-выражения | |
hist_operation | - | операция: INSERT,UPDATE,DELETE,TRUNCATE | |
hist_update_columns | - | список обновленных столбцов для операции UPDATE | |
hist_db_user | - | пользователь базы данных | |
hist_app_user | - | пользователь приложения, определяется как current_setting('app.user') | |
hist_application_name | - | имя приложения | |
hist_query_text | - | текст SQL-запроса | |
hist_statement_id | - | ID SQL-выражения, ссылается на таблицу pghist.hist_statement | |
[primary key column(s)] | - | значение первичного ключа (можно быть несколько) | |
[column(s) of foreign key on master table] | - | значение внешного ключа на мастер-таблицу (необязательно, можно быть несколько) | |
[column...]_old | - | старое значение для каждого столбца таблицы [schema].[table] |
Примеры вызова:
select * from example.document_hist; select * from example.document_hist where id=2; select * from example.document_hist where hist_operation='DELETE';
[schema].[table]_changes(where_clause text, where_param anyelement, cascade boolean)
Функция возвращает изменения в таблице (setof pghist.table_change), создается при включении ведения истории.
Сортировка по первым трем столбцам обеспечивает хронологию по времени, для получения связанных данных из нескольких таблиц рекомендуется использовать оператор union all
Параметры:
where_clause | - | условие на таблицу (необязательный) | |
where_param | - | значение параметра в where_clause (необязательный) | |
columns_immutable | - | возвращать значения неизменямых столбцов (по умолчанию false) | |
insert_detail | - | детализировать операцию INSERT по столбцам (по умолчанию false) | |
cascade | - | учитывать унаследованные таблицы (по умолчанию true) |
Столбцы возвращаемого набора данных:
statement_num | - | глобальный номер SQL-выражения | |
row_num | - | номер строки в наборе данных, который изменяет SQL-выражения | |
column_num | - | номер столбца в строке | |
timestamp | - | дата-время операции | |
operation | - | операция: INSERT,UPDATE,DELETE,TRUNCATE | |
operation_name | - | наименование операции, задается переопределяемой функцией pghist.hist_custom_operation_name | |
column_name | - | имя столбца | |
column_comment | - | комментарий столбца | |
value_old | - | старое значение | |
value_old_desc | - | описание старого значения, можно переопредилить через процедуру pghist.hist_expression_value_desc | |
value_new | - | новое значение | |
value_new_desc | - | описание нового значение, можно переопредилить через процедуру pghist.hist_expression_value_desc | |
row_desc | - | описание строки, можно переопредилить через процедуру pghist.hist_expression_row_desc | |
db_user | - | пользователь базы данных | |
db_user_name | - | имя пользователя базы данных, задается переопределяемой функцией pghist.hist_custom_db_user_name | |
app_user | - | пользователь приложения, задается переопределяемой функцией pghist.hist_custom_app_user | |
app_user_name | - | имя пользователя приложения, задается переопределяемой функцией pghist.hist_custom_app_user_name | |
schema | - | схема | |
table_name | - | имя таблицы | |
table_comment | - | комментарий таблицы |
Примеры вызова:
select * from example.document_changes(); select * from example.invoice_product_changes('id=$1',2) where column_name not in ('id','invoice_id') order by hist_id desc,column_pos
[schema].[table]_at_timestamp(transaction_start timestamptz, cascade boolean)
Функция создает временную таблицу [schema]_[table]_at_timestamp как копию исходной таблицы по состоянию на момент времени и возращает ее
Параметры:
transaction_timestamp | - | дата-время завершения транзации, по умолчанию current_setting('pghist.at_timestamp') | |
cascade | - | учитывать унаследованные таблицы (по умолчанию true) |
Примеры вызова:
select * from example.document_at_timestamp(now()-interval '1 hour'); do $$ begin perform set_config('pghist.at_timestamp', '2024-04-06 10:00:00', true); perform example.invoice_at_timestamp(); perform example.customer_at_timestamp(); end; $$;
pghist.hist_disable(schema name, table_name name)
Процедура выключает ведение истории изменений для указанной таблицы, удаляет необходимые объекты
Параметры:
schema | - | схема таблицы (необязательный) | |
table_name | - | имя таблицы |
Примеры вызова:
call pghist.hist_disable('document'); call pghist.hist_disable('example', 'invoice');
SQL-выражения описаний
pghist.hist_expression_row_desc(schema name, table_name name, expression varchar)
pghist.hist_expression_value_desc(schema name, table_name name, column_name name, expression varchar)
Процедуры устанавливают выражение для описания строки/значения поля, в выражении доступна переменная $1 c строкой/значением поля
pghist.hist_expression_row_desc_current(schema name, table_name name)
pghist.hist_expression_value_desc_current(schema name, table_name name, column_name name)
Функции возвращают текущее выражение для описания строки/значения поля
pghist.hist_expression_row_desc_default(schema name, table_name name)
pghist.hist_expression_value_desc_default(schema name, table_name name, column_name name)
Функции возвращают выражение по умолчанию для описания строки/значения поля. Для строки возращается комментарий таблицы с первичным ключом, для столбца, являющегося внешним ключом, - первое текстовое поля связанной таблицы.
Параметры:
schema | - | схема таблицы | |
table | - | имя таблицы | |
column_name | - | имя столбца | |
expression | - | выражение, null отменяет сохраненное описание |
Примеры вызова:
call pghist.hist_expression_row_desc('example', 'invoice', '''Invoice'''); call pghist.hist_expression_row_desc('example', 'invoice_product', $$ 'Row #'||$1.id||' / '||(select name from example.product where id=$1.product_id) $$); call pghist.hist_expression_value_desc('example', 'invoice_product', 'color', $$ case when $1='R' then 'Red' when $1='B' then 'Blue' when $1='G' then 'Green' else $1 end $$); select pghist.hist_expression_row_desc_current('example', 'invoice_product'); select pghist.hist_expression_value_desc_default('example', 'invoice_product', 'color');
Функции кастомизации
Для кастомизации и локализации полей конкретного приложения можно определить собственные функции.
Рекомендуется в SQL-менеджере (например, pgAdmin или DBeaver) взять за основу функцию по умолчанию, переопределить ее и сохранить в схеме приложения под другим именем.
Столбцы, доступные для переопределения:
operation_name | - | наименование операции | |
db_user_name | - | имя пользователя базы данных | |
app_user | - | пользователь приложения | |
app_user_name | - | имя пользователя приложения | |
app_client_addr | - | IP адрес клиентского приложения | |
app_client_hostname | - | Имя хоста(компьютера) клиентского приложения |
pghist.hist_column_custom_function(column_name name, custom_function name)
Процедура устанавливает функцию для получения значения поля
Параметры:
column_name | - | имя столбца | |
custom_function | - | имя функции без параметров |
pghist.hist_column_custom_function_current(column_name name)
Функция возвращает текущую функцию для получения значения поля
Параметр:
column_name | - | имя столбца |
Пример:
select pghist.hist_column_custom_function_current('db_user_name'); create or replace function myapp.user_name(db_user name) returns varchar language plpgsql as $$ begin return (select name from myapp.users where login=db_user); end; $$; call pghist.hist_column_custom_function('db_user_name', 'myapp.user_name');
Таблица истории pghist.hist_data$[schema]_[table]
При включении истории дополнительно к основной таблице создается таблица истории, разработчику (владельцу основной таблицы) доступна через представление [schema].[table]_hist
Столбцы:
hist_statement_id | - | ID SQL-выражения, ссылается на таблицу pghist.hist_statement | |
hist_row_num | - | номер строки в наборе данных, который изменяет SQL-выражения | |
hist_update_columns | - | список обновленных столбцов для операции UPDATE | |
[primary key column(s)] | - | значение первичного ключа (можно быть несколько) | |
[column(s) of foreign key on master table] | - | значение внешного ключа на мастер-таблицу (необязательно, можно быть несколько) | |
[column...]_old | - | старое значение для каждого столбца таблицы [schema].[table] |
Пример использования:
select * from pghist.hist_data$example_invoice h join pghist.hist_statement s on s.id=h.hist_statement_id join pghist.hist_query q on q.hash=s.query_hash where q.text like 'do%begin%'
Общие таблицы
pghist.hist_transaction | - | транзакции |
pghist.hist_query | - | SQL-запросы |
pghist.hist_statement | - | SQL-выражения |
pghist.hist_table | - | таблицы с историей |
pghist.hist_table_column | - | столбцы таблиц с историей |
pghist.hist_column_custom_function | - | кастомизированные функции столбцов |
При установке создаются таблицы, которые хранят общую информацию по изменениям (дата-время транзакции и SQL-выражения, операция, SQL-запрос, пользователь, сессия и т.д.), и таблицы с настройками. Изменение общих таблиц осуществляется через хранимые процедуры, допускается только чтение. По умолчанию разработчикам (владельцам основных таблицы) общие таблицы недоступны, при необходимости доступ выдается вручную.
Таблица истории pghist.hist_data$[schema]_[table] по полю statement_id ссылается на pghist.hist_statement, которая в свою очередь ссылается на pghist.hist_transaction и pghist.hist_query.
Пример использования:
select * from pghist.hist_statement s join pghist.hist_transaction t on t.id=s.transaction_id join pghist.hist_query q on q.hash=s.query_hash where t.timestamp_commit between '2024-04-06 10:00:00' and '2024-04-06 11:00:00'; select * from pghist.hist_table ht left join pghist.hist_table_column htc on htc.schema=ht.schema and htc.table_name=ht.name;
pghist.pghist_version()
Функция возвращает версию инструмента
pghist.hist_sql_log
Все команды, выполняемые утилитой, записываются в лог-таблицу pghist.hist_sql_log
Примеры использования:
select * from pghist.hist_sql_log where schema='example' and table_name='document' order by id; select * from pghist.hist_sql_log l join pghist.hist_transaction t on t.id=l.transaction_id where schema='example' and table_name='document' order by 1 desc;