Я использую триггер для записи всех операций ОБНОВЛЕНИЕ и ВСТАВКА , но в моей таблице много столбцов, и я хотел бы указать, какой столбец я обновил или вставил, и их новые и старые ценности. Ниже приведена демонстрация того, чего я пытаюсь достичь:
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;
Как видите, все столбцы записываются во время изменения, что не так информативно для большой таблицы. Как я могу изменить свою функцию триггера?