【问题标题】:How store as JSON the new data inside a trigger in PostgreSQL?如何在 PostgreSQL 的触发器中将新数据存储为 JSON?
【发布时间】:2016-10-15 21:51:22
【问题描述】:

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

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

以 JSON 形式审核值

对于 PostgreSQL 9.2 或带有出色 json_91 插件的 9.1,您可以 将表中的旧值和新值记录为结构化 json 而不是 纯文本,让您更有能力查询您的审计历史。 只需更改 v_old_data、v_new_data、original_data 和 new_data 从 TEXT 到 json,然后替换 ROW(OLD.) 和 ROW(NEW.) 分别使用 row_to_json(OLD) 和 row_to_json(NEW)。

但是这给我一个错误:

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(location) 不存在

如果我输入v_new_data := row_to_jsonb(ROW(NEW));,那么我会得到:

错误:函数 row_to_jsonb(record) 不存在

【问题讨论】:

  • 我再试一次,是的,使用 json 可以,但使用 jsonb 不行。

标签: json postgresql triggers postgresql-9.5


【解决方案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 类型生成所需的结果。

【讨论】:

    猜你喜欢
    • 2012-03-17
    • 2011-05-02
    • 2019-09-02
    • 1970-01-01
    • 1970-01-01
    • 2021-09-14
    • 1970-01-01
    • 2015-10-28
    • 1970-01-01
    相关资源
    最近更新 更多