简体   繁体   中英

Record changes in a different table

I have successfully set up a history table according to this tutorial: https://www.cybertec-postgresql.com/en/tracking-changes-in-postgresql/

My problem is that this function saves both the whole new record and the whole old record as jsons.

How can I alter this function so that only those column titles and values will be added to the json, which have really been changed? In other words how can I replace the expression 'row_to_json(OLD)' with one which represents only the difference between row_to_json(NEW) row_to_json(OLD)?

CREATE FUNCTION change_trigger() RETURNS trigger AS $$

BEGIN
    IF TG_OP = 'INSERT'
        THEN
            INSERT INTO logging.t_history (tabname, schemaname, operation, new_val)
                VALUES (TG_RELNAME, TG_TABLE_SCHEMA, TG_OP, row_to_json(NEW));
            RETURN NEW;
        ELSIF   TG_OP = 'UPDATE'
        THEN
            INSERT INTO logging.t_history (tabname, schemaname, operation, new_val, old_val)
                VALUES (TG_RELNAME, TG_TABLE_SCHEMA, TG_OP,
                    row_to_json(NEW), row_to_json(OLD));
            RETURN NEW;
        ELSIF   TG_OP = 'DELETE'
        THEN
            INSERT INTO logging.t_history (tabname, schemaname, operation, old_val)
                VALUES (TG_RELNAME, TG_TABLE_SCHEMA, TG_OP, row_to_json(OLD));
            RETURN OLD;
    END IF;
 END;
$$ LANGUAGE 'plpgsql' SECURITY DEFINER;

Finally figured out that

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM