Действительно ли возможно динамично циклично выполниться через столбцы таблицы?

У меня есть триггерная функция для теста таблицы, который имеет следующий фрагмент кода:

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

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

Как это может быть сделано?

5
задан Erwin Brandstetter 31 December 2018 в 01:00
поделиться

3 ответа

Взгляните на information_schema, там есть представление "столбцы". Выполните запрос, чтобы получить все текущие имена столбцов из таблицы, которая запустила триггер:

SELECT 
    column_name 
FROM 
    information_schema.columns 
WHERE 
    table_schema = TG_TABLE_SCHEMA 
AND 
    table_name = TG_TABLE_NAME;

Просмотрите результат, и готово!

Дополнительную информацию можно найти в руководстве Fine .

7
ответ дан 18 December 2019 в 09:05
поделиться

Из документации 9.0 beta2 о WHEN клаузе в триггерах, который может быть использован в более ранних версиях в теле триггера:

OLD.* IS DISTINCT FROM NEW.*

или возможно (из 8. 2 release notes)

IF row(new.*) IS DISTINCT FROM row(old.*)

8
ответ дан 18 December 2019 в 09:05
поделиться

Используйте pl / perl или pl / python. Они намного лучше подходят для таких задач. намного лучше.

Вы также можете установить hstore-new и использовать его семантику row-> hstore, но это определенно не лучшая идея при использовании обычных типов данных.

1
ответ дан 18 December 2019 в 09:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: