В некоторых случаях я хотел бы до UPDATE
проверить, какие столбцы изменены.Чтобы сделать его как можно более общим, я не хочу использовать схемы, имена таблиц или столбцов в функции.Я нашел какое-то решение здесь, в SO и других местах, и мне особенно понравилась идея использовать hstore
из этого ответа
Недостаток hstore
, как широко сказано, так ли этоЯ теряю типы данных, все в порядке.
Но используя его в контексте триггера (не имея сложных столбцов типа json
или hstore
), где и NEW
, и OLD
имеют одинаковый набор столбцов с соответствующими типами данных, я мог бы подуматьтолько из одной проблемы: NULL и пустые значения не будут различимы.
С какими еще проблемами я могу столкнуться, когда обнаружу изменения в функции триггера, такие как:
changes := hstore(NEW) - hstore(OLD);
Кажется альтернативаиспользовать jsonb
, а затем написать некоторую функцию jsonb_diff
для обнаружения изменений.Предлагаемая hstore
внутренняя операция вычитания кажется более надежной, но, возможно, я не учел все слабые места в ней.
Я использую Postgres 9.6.