Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql Postgres-触发日志记录,但也记录行的单个值_Postgresql - Fatal编程技术网

Postgresql Postgres-触发日志记录,但也记录行的单个值

Postgresql Postgres-触发日志记录,但也记录行的单个值,postgresql,Postgresql,我对PostgreSQL很陌生 我目前正在使用以下代码(从)记录对表的更改 declare json_new jsonb; json_old jsonb; begin if tg_op = 'INSERT' then json_new:= to_jsonb(new); elsif tg_op = 'DELETE' then json_old:= to_jsonb(old); else select jsonb

我对PostgreSQL很陌生

我目前正在使用以下代码(从)记录对表的更改

declare
    json_new jsonb;
    json_old jsonb;
begin
    if tg_op = 'INSERT' then
        json_new:= to_jsonb(new);
    elsif tg_op = 'DELETE' then
        json_old:= to_jsonb(old);
    else
        select jsonb_object_agg(new_key, new_value), jsonb_object_agg(old_key, old_value)
        into json_new, json_old
        from jsonb_each(to_jsonb(new)) as n(new_key, new_value)
        join jsonb_each(to_jsonb(old)) as o(old_key, old_value) 
        on new_key = old_key and new_value <> old_value;
    end if;
    insert into logging.t_history(tabname, schemaname, operation, old_val, new_val)
    values (tg_relname, tg_table_schema, tg_op, json_old, json_new);
    return null;
end;
声明
json_新jsonb;
json_旧jsonb;
开始
如果tg_op='INSERT',则
json_new:=to_jsonb(new);
elsif tg_op='DELETE'然后
json_old:=to_jsonb(old);
其他的
选择jsonb_对象_agg(新_键,新_值),jsonb_对象_agg(旧_键,旧_值)
变成新的,旧的
从jsonb_each(到jsonb(新))作为n(新_键,新_值)
将每个jsonb_(to_jsonb(old))连接为o(old_键,old_值)
新_键上=旧_键和新_值旧_值;
如果结束;
插入logging.t_history(选项卡名、模式名、操作、旧值、新值)
值(tg_relname、tg_table_schema、tg_op、json_old、json_new);
返回null;
结束;
我还希望能够记录已更改行的唯一“refno”

我已尝试声明该值,可能不正确

declare
    json_new jsonb;
    json_old jsonb;
    refno varchar;
begin
    if tg_op = 'INSERT' then
        json_new:= to_jsonb(new);
    elsif tg_op = 'DELETE' then
        json_old:= to_jsonb(old);
    else
        select jsonb_object_agg(new_key, new_value), jsonb_object_agg(old_key, old_value)
        into json_new, json_old
        from jsonb_each(to_jsonb(new)) as n(new_key, new_value)
        join jsonb_each(to_jsonb(old)) as o(old_key, old_value) 
        on new_key = old_key and new_value <> old_value;
    end if;
    insert into logging.t_history(tabname, schemaname, operation, old_val, new_val, refno)
    values (tg_relname, tg_table_schema, tg_op, json_old, json_new, refno);
    return null;
end;
声明
json_新jsonb;
json_旧jsonb;
refno-varchar;
开始
如果tg_op='INSERT',则
json_new:=to_jsonb(new);
elsif tg_op='DELETE'然后
json_old:=to_jsonb(old);
其他的
选择jsonb_对象_agg(新_键,新_值),jsonb_对象_agg(旧_键,旧_值)
变成新的,旧的
从jsonb_each(到jsonb(新))作为n(新_键,新_值)
将每个jsonb_(to_jsonb(old))连接为o(old_键,old_值)
新_键上=旧_键和新_值旧_值;
如果结束;
插入logging.t_history(选项卡名、模式名、操作、旧值、新值、参考号)
值(tg_relname、tg_table_schema、tg_op、json_old、json_new、refno);
返回null;
结束;
但是,我得到以下错误:-

无法将更改提交到层

错误:错误:1个属性值更改未应用

提供程序错误: 更改属性时PostGIS错误:错误:关系“t_history”的列“refno”不存在 第1行:…ory(选项卡名、模式名、操作、旧值、新值、参考号) ^ 查询:插入logging.t_历史记录(选项卡名、模式名、操作、旧值、新值、参考号) 值(tg_relname、tg_table_schema、tg_op、json_old、json_new、refno) 上下文:PL/pgSQL函数change_trigger2()SQL语句第17行

更改是通过PostGIS进行的-第一个触发器工作正常,但第二个触发器失败

任何帮助都将不胜感激!先谢谢你

编辑:-

我通过使用新旧值并向日志记录表中添加新旧列来声明refno的值。 然而,我更喜欢的选择是一个单独的refno列,根据出现的列来容纳新旧列

declare
    json_new jsonb;
    json_old jsonb;
    old_refno varchar := old.refno;
    new_refno varchar := new.refno;
begin
    if tg_op = 'INSERT' then
        json_new:= to_jsonb(new);
    elsif tg_op = 'DELETE' then
        json_old:= to_jsonb(old);
    else
        select jsonb_object_agg(new_key, new_value), jsonb_object_agg(old_key, old_value)
        into json_new, json_old
        from jsonb_each(to_jsonb(new)) as n(new_key, new_value)
        join jsonb_each(to_jsonb(old)) as o(old_key, old_value) 
        on new_key = old_key and new_value <> old_value;
    end if;
    insert into logging.t_history(tabname, schemaname, operation, old_val, new_val, old_refno, new_refno)
    values (tg_relname, tg_table_schema, tg_op, json_old, json_new, old_refno, new_refno);
    return null;
end;
声明
json_新jsonb;
json_旧jsonb;
old_refno varchar:=old.refno;
new_refno varchar:=new.refno;
开始
如果tg_op='INSERT',则
json_new:=to_jsonb(new);
elsif tg_op='DELETE'然后
json_old:=to_jsonb(old);
其他的
选择jsonb_对象_agg(新_键,新_值),jsonb_对象_agg(旧_键,旧_值)
变成新的,旧的
从jsonb_each(到jsonb(新))作为n(新_键,新_值)
将每个jsonb_(to_jsonb(old))连接为o(old_键,old_值)
新_键上=旧_键和新_值旧_值;
如果结束;
插入logging.t_history(选项卡名、模式名、操作、旧值、新值、旧值、新值)
值(tg_relname、tg_table_schema、tg_op、json_old、json_new、old_refno、new_refno);
返回null;
结束;

“历史记录”关系的“参考号”列不存在。检查表中是否有这样一列。非常感谢您的回复-我错过了添加该列的过程。它现在可以正常工作,但是refno值为空。“t_history”关系的“refno”列不存在”。检查表中是否有这样一列。非常感谢您的回复-我错过了添加该列的过程。它现在可以正常工作,但是refno值为空。