Динамический аудит данных с помощью триггера PostgreSQL - PullRequest
1 голос
/ 28 ноября 2011

Я заинтересован в использовании следующего механизма аудита в существующей базе данных PostgreSQL.

http://wiki.postgresql.org/wiki/Audit_trigger

но, хотел бы (если возможно) сделать одну модификацию. Я также хотел бы записать значение primary_key, где оно может быть запрошено позже. Итак, я хотел бы добавить поле с именем что-то вроде «record_id» в таблицу «logged_actions». Проблема заключается в том, что каждая таблица в существующей базе данных имеет разные имена полей первичного ключа. Хорошей новостью является то, что база данных имеет очень последовательное соглашение об именах. Это всегда, _id. Таким образом, если таблица была названа «employee», первичным ключом будет «employee_id».

Есть ли в любом случае, чтобы сделать это? По сути, мне нужно что-то вроде OLD.FieldByName (x) или OLD [x], чтобы получить значение из поля id для помещения в поле record_id в новой записи аудита.

Я понимаю, что мог бы просто создать отдельный, настраиваемый триггер для каждой таблицы, которую я хочу отслеживать, но было бы неплохо, чтобы он был универсальным.

edit: я также понимаю, что значение ключа регистрируется либо в старых, либо в новых полях данных. Но я бы хотел, чтобы запросы к истории были проще и эффективнее. Другими словами,

select * from audit.logged_actions where table_name = 'xxxx' and record_id = 12345;

другое редактирование: я использую PostgreSQL 9.1

Спасибо!

1 Ответ

1 голос
/ 29 ноября 2011

Вы не упомянули свою версию PostgreSQL, что очень важно при написании ответов на подобные вопросы.

Если вы используете PostgreSQL 9.0 или новее (или можете обновить), вы можете использовать этот подход, как описано в Pavel:

http://okbob.blogspot.com/2009/10/dynamic-access-to-record-fields-in.html

В общем, вам нужно сослаться на динамически именованное поле в переменной PL / PgSQL с типом записи, такой как 'NEW' или 'OLD'. Исторически это было досадно сложно, и все еще неловко, но по крайней мере возможно в 9.0.

Другой вариант, который может быть проще, - написать триггеры аудита в plperlu, где ссылки на динамические поля тривиальны.

...