Find different in two jsonb , PostgreSQL trigger function

好久不见. 提交于 2019-12-11 23:34:52

问题


user

  CREATE TABLE IF NOT EXISTS "user"(
    "id" SERIAL NOT NULL,
    "create_date" timestamp without time zone NOT NULL,
    "last_modified_date" timestamp without time zone,
    "last_modified_by_user_id" integer,
    "status" integer NOT NULL,

    PRIMARY KEY ("id")
  );

user_track

CREATE TABLE IF NOT EXISTS "user_track"(
    "date" timestamp without time zone,
    "by_user_id" integer, 
    "origin_value" jsonb,
    "new_value" jsonb
  );

function

  CREATE OR REPLACE FUNCTION user_track_insert()
  RETURNS TRIGGER AS $$
  BEGIN
    INSERT INTO user_track(date, new_value)
       VALUES(NEW.create_date, row_to_json(NEW)::jsonb);
    RETURN NEW;
  END;
  $$ LANGUAGE plpgsql;

  CREATE OR REPLACE FUNCTION user_track_delete()
  RETURNS TRIGGER AS $$
  BEGIN
    INSERT INTO user_track(date, by_user_id, origin_value)
       VALUES(create_date, user_id, row_to_json(OLD)::jsonb);
    RETURN NEW;
  END;
  $$ LANGUAGE plpgsql;

  CREATE OR REPLACE FUNCTION user_track_update()
  RETURNS TRIGGER AS $$
  DECLARE
    js_new jsonb := row_to_json(NEW)::jsonb;
    js_old jsonb := row_to_json(OLD)::jsonb;
  BEGIN
    INSERT INTO user_track(date, by_user_id, origin_value, new_value)
       VALUES(NEW.create_date, OLD.id, js_old - js_new, js_new - js_old);
    RETURN NEW;
  END;
  $$ LANGUAGE plpgsql;

trigger

  CREATE TRIGGER user_track_insert_trigger AFTER INSERT ON "user"
    FOR EACH ROW EXECUTE PROCEDURE user_track_insert();
  CREATE TRIGGER user_track_delete_trigger AFTER DELETE ON "user"
    FOR EACH ROW EXECUTE PROCEDURE user_track_delete();
  CREATE TRIGGER user_track_update_trigger AFTER UPDATE ON "user"
    FOR EACH ROW EXECUTE PROCEDURE user_track_update();



When I do update in pgadmin got error:

ERROR:  operator does not exist: jsonb - jsonb
LINE 2:        VALUES(NEW.create_date, OLD.id, js_old - js_new, js_n...
                                                      ^
ERROR: operator does not exist: jsonb - jsonb
SQL state: 42883
Hint: No operator matches the given name and argument type(s). You might need to add explicit type casts.
Context: PL/pgSQL function user_track_update() line 6 at SQL statement
  • I only want to save json data present changed column/value not whole row all column.
    I can't find jsonb - jsonb in document, so seems there is no such operator ...

  • How to pass parameter into user_track_delete function, for example if I want to some other use.id who execute this action ?

PostgreSQL 9.5.2

来源:https://stackoverflow.com/questions/38296728/find-different-in-two-jsonb-postgresql-trigger-function

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!