У меня есть триггерная функция для теста таблицы, который имеет следующий фрагмент кода:
IF TG_OP='UPDATE' THEN
IF OLD.locked > 0 AND
( OLD.org_id <> NEW.org_id OR
OLD.document_code <> NEW.document_code OR
-- other columns ...
)
THEN
RAISE EXCEPTION 'Message';
-- more code
Таким образом, я статически проверяю новое значение всего столбца с его предыдущим значением для обеспечения целостности. Теперь каждый раз моя бизнес-логика изменяется, и я должен добавить новые столбцы в ту таблицу, я должен буду изменить этот триггер каждый раз. Я думал, что будет лучше, если так или иначе я мог бы динамично проверить все столбцы той таблицы, явно не вводя их имя.
Как это может быть сделано?
Взгляните на information_schema, там есть представление "столбцы". Выполните запрос, чтобы получить все текущие имена столбцов из таблицы, которая запустила триггер:
SELECT
column_name
FROM
information_schema.columns
WHERE
table_schema = TG_TABLE_SCHEMA
AND
table_name = TG_TABLE_NAME;
Просмотрите результат, и готово!
Дополнительную информацию можно найти в руководстве Fine .
Из документации 9.0 beta2 о WHEN
клаузе в триггерах, который может быть использован в более ранних версиях в теле триггера:
OLD.* IS DISTINCT FROM NEW.*
или возможно (из 8. 2 release notes)
IF row(new.*) IS DISTINCT FROM row(old.*)
Используйте pl / perl или pl / python. Они намного лучше подходят для таких задач. намного лучше.
Вы также можете установить hstore-new и использовать его семантику row-> hstore, но это определенно не лучшая идея при использовании обычных типов данных.