postgreSQL журнал изменен столбец - PullRequest
2 голосов
/ 13 января 2020

Я использую триггер для записи всех операций ОБНОВЛЕНИЕ и ВСТАВКА , но в моей таблице много столбцов, и я хотел бы указать, какой столбец я обновил или вставил, и их новые и старые ценности. Ниже приведена демонстрация того, чего я пытаюсь достичь:

big table                   
-------------------------   
id       |feild_1   | field_2| field_3 .....          
-----------------------------------------------     
usr1     |old_value1|   
usr2     |old_value2|  

предположим, что я изменяю значение в usr1 filed_1 на 'new_value1'. Я хотел бы видеть в своей истории изменений:

change history
------------------------- 
id       |field_changed  | old_value | new_value |        
----------------------------------------------------------- 
usr1     |field_1        |old_value_1|new_value_1|  

Трудность заключается в получении названия столбца, который я изменил. Используемая мной текущая функция триггера изменена с { ссылка }. Это выглядит следующим образом:

CREATE FUNCTION change_trigger() RETURNS trigger AS $$
       BEGIN
         IF TG_OP = 'INSERT'
         THEN INSERT INTO change_history (
                id, old_value, new_value
              ) VALUES (
                OLD.id, row_to_json(OLD), row_to_json(NEW)
              );
           RETURN NEW;
         ELSIF  TG_OP = 'UPDATE'
         THEN
           INSERT INTO change_history (
             id, old_value, new_value
           )
           VALUES (OLD.id, row_to_json(OLD), row_to_json(NEW));
           RETURN NEW;
         END IF;
       END;
$$ LANGUAGE 'plpgsql' SECURITY DEFINER;

Как видите, все столбцы записываются во время изменения, что не так информативно для большой таблицы. Как я могу изменить свою функцию триггера?

1 Ответ

1 голос
/ 13 января 2020

PostgreSQL всегда обновляет всю строку, и в триггере нет способа определить, какие столбцы были перечислены в предложении SET оператора UPDATE.

Лучшее, что вы можете сделать чтобы выяснить, какие столбцы будут изменены UPDATE, протестировав

IF OLD.col IS DISTINCT FROM NEW.col
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...