Postgresql [42P01]错误:触发函数期间不存在关系

问题描述 投票:0回答:1

[我正在尝试编写一个触发器,将触发器的先前版本存储在给定名为tablename的表中的audit_tablename表中。

这里是代码...

CREATE OR REPLACE FUNCTION process_ui_audit()
RETURNS TRIGGER AS

$$

DECLARE

audit_table_name   text := TG_TABLE_SCHEMA || '.audit_' || TG_TABLE_NAME;
audit_table_schema text := TG_TABLE_SCHEMA;

BEGIN

IF (TG_OP = 'UPDATE')
THEN

    EXECUTE FORMAT('INSERT INTO %1$I SELECT NEXTVAL(''$1.hibernate_sequence''),now(), user, ($1).*',
                   audit_table_name, audit_table_schema)
        USING OLD;

    NEW.version = OLD.version + 1;

    RETURN NEW;

ELSIF (TG_OP = 'INSERT')
THEN

    NEW.version = 1;

    RETURN NEW;

END IF;

END;

[当我尝试更新一行时,触发器运行,并且出现类似这样的错误...。

[42P01]错误:关系“ webapp.audit_portal_user”不存在其中:PL / pgSQL函数webapp.process_ui_audit()第13行位于EXECUTE

我不知道我是不正确地格式化表名还是其他?表名webapp.audit_portal_user明确存在。

postgresql plpgsql database-trigger
1个回答
0
投票

它无需指定架构名称即可工作。

这里是一个简化的示例:

create table portal_user(
uid     int,
uname   text
);
CREATE TABLE

create table audit_portal_user(
uid      int,
uname    text,
who      text,
what     text,
ts       timestamp
);
CREATE TABLE

create or replace function process_ui_audit()
returns trigger as
$$
declare
audit_table_name   text := 'audit_' || tg_table_name;
begin
 if (tg_op = 'UPDATE')
 then
    execute format('insert into %I values($1.*, user, %L, now())', 
                    audit_table_name, 'UPDATE') using new;
    return null;
 end if;
end;
$$
language plpgsql;
CREATE FUNCTION

create trigger audit
after update on portal_user
for each row
execute function process_ui_audit();
CREATE TRIGGER

insert into portal_user values(12, 'titi');
INSERT 0 1

select * from portal_user;
 uid | uname 
-----+-------
  12 | titi
(1 row)

update portal_user set uname='toto' where uid=12;
UPDATE 1

select * from portal_user;
 uid | uname 
-----+-------
  12 | toto
(1 row)

select * from audit_portal_user;
 uid | uname |   who    |  what  |             ts             
-----+-------+----------+--------+----------------------------
  12 | toto  | postgres | UPDATE | 2020-06-01 10:20:36.549257
(1 row)
© www.soinside.com 2019 - 2024. All rights reserved.