PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Sử dụng trình kích hoạt Postgres để chỉ ghi lại JSON của các trường đã sửa đổi

Chức năng kích hoạt của bạn không thể hoạt động tốt, nó tạo ra lỗi khi chèn một hàng:

Bạn nên xử lý ba trường hợp INSERT , UPDATEDELETE riêng:

create or replace function changelog_procedure() 
returns trigger as $$
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 tbl_changelog(tbl, op, new, old)
    values (tg_table_name, tg_op, json_new, json_old);
    return null;
end;
$$ language plpgsql;



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ánh xạ cột PostgreSQL JSON thành thuộc tính thực thể Hibernate

  2. String_agg cho nhiều cột

  3. Làm cách nào để chèn dấu thời gian với múi giờ trong postgresql với câu lệnh đã chuẩn bị?

  4. Loại bỏ tính duy nhất của chỉ mục trong PostgreSQL

  5. Nxlog im_dbi không hoạt động