首页 > 解决方案 > Postgresql [42P01] 错误:触发函数期间不存在关系

问题描述

我正在尝试编写一个触发器,在给定名为 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 确实存在。

标签: postgresqlplpgsqldatabase-trigger

解决方案


它无需指定模式名称即可工作。

这是一个简化的示例:

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)

推荐阅读