Postgresql Postgres-触发日志记录,但也记录行的单个值
我对PostgreSQL很陌生 我目前正在使用以下代码(从)记录对表的更改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
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值为空。