Возможно ли использование триггеров в PostgreSQL для создания обновлений и вставки SQL-запросов изменений, которые произошли с таблицей, и их в файл для последующего выполнения.
Это нужно использовать только временно, чтобы что-то быстро и грязно.
Возможно ли использование триггеров в PostgreSQL для создания обновлений и вставки SQL-запросов изменений, которые произошли с таблицей, и их в файл для последующего выполнения.
Это нужно использовать только временно, чтобы что-то быстро и грязно.
пример триггера аудита из https://www.postgresql.org/docs/current/static/plpgsql-trigger.html
CREATE TABLE emp (
empname text NOT NULL,
salary integer
);
CREATE TABLE emp_audit(
operation char(1) NOT NULL,
stamp timestamp NOT NULL,
userid text NOT NULL,
empname text NOT NULL,
salary integer
);
CREATE OR REPLACE FUNCTION process_emp_audit() RETURNS TRIGGER AS $emp_audit$
BEGIN
--
-- Create a row in emp_audit to reflect the operation performed on emp,
-- make use of the special variable TG_OP to work out the operation.
--
IF (TG_OP = 'DELETE') THEN
INSERT INTO emp_audit SELECT 'D', now(), user, OLD.*;
RETURN OLD;
ELSIF (TG_OP = 'UPDATE') THEN
INSERT INTO emp_audit SELECT 'U', now(), user, NEW.*;
RETURN NEW;
ELSIF (TG_OP = 'INSERT') THEN
INSERT INTO emp_audit SELECT 'I', now(), user, NEW.*;
RETURN NEW;
END IF;
RETURN NULL; -- result is ignored since this is an AFTER trigger
END;
$emp_audit$ LANGUAGE plpgsql;
CREATE TRIGGER emp_audit
AFTER INSERT OR UPDATE OR DELETE ON emp
FOR EACH ROW EXECUTE PROCEDURE process_emp_audit();
Вам действительно нужен журнал аудита запросов, хранящихся в таблице? Самый простой способ получить файл со всеми запрошенными запросами - использовать встроенную запись в postgresql.
В вашем postgresql.conf(обычно в директории $PG_DATA) установите следующие параметры соответствующим образом:
log_directory '/path/to/log/dir'
log_filename = 'filename.log'
log_statement = 'mod'
Этот последний параметр позволяет регистрировать все инструкции INSERT, UPDATE, DELETE, TRUNCATE и COPY FROM.
Подробнее в документах Postgres: http://www.postgresql.org/docs/current/static/runtime-config-logging.html
Ссылка ниже должна указывать на вас в правильном направлении.
http://developer.postgresql.org/pgdocs/postgres/sql-createtrigger.html
В зависимости от того, что вы хотите сделать, лучше всего включить ведение журнала.
Журнал записей PostgreSQL от Andreas Scherbaum является расширением Postgresql, которое использует триггер для записи любых INSERT, UPDATE и DELETE в определенной таблице в другую таблицу.
Использование очень просто: вы создаете вторую таблицу, которая имеет тот же формат, что и ваша таблица, на которую вы хотите следить. Кроме того, вам нужны дополнительные столбцы для ведения зарегистрированных данных.
Вторая часть табличного журнала способна восстановить состояние исходной таблицы или определенной строки в любое время в прошлом.
Я сам не пробовал, но он якобы работает.
Там также слайды из разговоров о tablelog, но я не могу опубликовать правильную ссылку здесь из-за какой-то странной несвязанности стекаповерса:) (http://andreas.scherbaum.la/writings/tablelog.pdf).
http://pgfoundry.org/projects/tablelog/
http://andreas.scherbaum.la/blog/archives/100-Log-Table-Changes-in-PostgreSQL-with-tablelog.html