如何将新数据作为JSON存储在PostgreSQL的触发器中?

时间:2016-06-15 00:33:11

标签: json postgresql triggers postgresql-9.5

我尝试按照以下说明进行操作:

https://wiki.postgresql.org/wiki/Audit_trigger

  

将值审核为JSON

     

对于PostgreSQL 9.2或9.1带有梦幻般的json_91插件,你可以   将表中的旧值和新值记录为结构化的json而不是   平面文字,为您提供更多查询审核历史记录的能力。   只需更改v_old_data,v_new_data,original_data和的类型即可   从TEXT到json的new_data,然后替换ROW(OLD。)和ROW(NEW。)   分别使用row_to_json(OLD)和row_to_json(NEW)。

然而,这给我一个错误:

egg TRUE
bootleggers egg TRUE
egg is good TRUE
eggisgood   TRUE
egg and ham TRUE
eggs and hams   TRUE
bootleggers TRUE
eggshells   TRUE
veggie  TRUE
reggae  TRUE

它说:

  

错误:函数row_to_jsonb(位置)不存在

如果我放CREATE OR REPLACE FUNCTION add_log (name text, Action TEXT, data jsonb, OUT RETURNS BOOLEAN) AS $$ BEGIN RETURNS = true; END; $$ LANGUAGE 'plpgsql'; CREATE OR REPLACE FUNCTION log_city() RETURNS TRIGGER AS $$ DECLARE v_new_data jsonb; BEGIN IF (TG_OP = 'UPDATE') THEN RETURN NEW; ELSIF (TG_OP = 'INSERT') THEN v_new_data := row_to_jsonb(NEW); EXECUTE add_log('City', 'City.New', v_new_data); RETURN NEW; END IF; RETURN NULL; -- result is ignored since this is an AFTER trigger END; $$ LANGUAGE plpgsql; INSERT INTO Location (city, state, country) values ('a', 'b' , 'c') ,那么我得到:

  

错误:函数row_to_jsonb(记录)不存在

1 个答案:

答案 0 :(得分:1)

documentation中陈述

  

表9-42显示了可用于创建json的函数   和jsonb值。 (jsonb没有等效的功能   row_to_json和array_to_json函数。但是,to_jsonb   功能提供与这些功能大致相同的功能   会。)

因此必须使用它row_to_json。 row_to_jsonb不存在,但row_to_json也会为JSONB类型生成所需的结果。