Есть ли способ получить JSON только измененных полей?
Теперь я использую следующий триггер, но вся строка печатается в журнале изменений.
Примеры таблиц:
TABLE tbl_changelog (
tbl TEXT,
op TEXT,
new JSON,
old JSON
);
TABLE tbl_items (
f1 TEXT,
f2 TEXT
);
Триггер:
CREATE OR REPLACE FUNCTION changelog_procedure() RETURNS trigger AS $$
BEGIN
INSERT INTO tbl_changelog(tbl, op, new, old)
VALUES (TG_TABLE_NAME, TG_OP, row_to_json(NEW), row_to_json(OLD));
RETURN NULL;
END;
$$ LANGUAGE plpgsql SECURITY DEFINER;
CREATE TRIGGER changelog_items
AFTER INSERT OR UPDATE OR DELETE ON tbl_items
FOR EACH ROW EXECUTE PROCEDURE changelog_procedure();
После вставки и загрузки f2 и f1 журнал изменений выглядит следующим образом:
tbl_changelog
------------------------------------------------------------------
tbl | op | new | old
------------------------------------------------------------------
tbl_items | INSERT | {f1: "aa", f2: "bb"} |
------------------------------------------------------------------
tbl_items | UPDATE | {f1: "aa", f2: "cc"} | {f1: "aa", f2: "bb"}
------------------------------------------------------------------
tbl_items | UPDATE | {f1: "dd", f2: "cc"} | {f1: "aa", f2: "cc"}
------------------------------------------------------------------
Я хотел бы записать только те изменения, которыеэто:
tbl_changelog
------------------------------------------------------------------
tbl | op | new | old
------------------------------------------------------------------
tbl_items | INSERT | {f1: "aa", f2: "bb"} |
------------------------------------------------------------------
tbl_items | UPDATE | {f2: "cc"} | {f2: "bb"}
------------------------------------------------------------------
tbl_items | UPDATE | {f1: "dd"} | {f1: "aa"}
------------------------------------------------------------------