postgresql - 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 确实存在。
解决方案
它无需指定模式名称即可工作。
这是一个简化的示例:
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)
推荐阅读
- azure - 使用 JavaScript 从 Azure Functions 对 Graph API 进行身份验证
- c++ - 访问和修改函数内部的结构数组
- kubernetes - Kubernetes Liveness 探针和环境变量
- react-native - 本地图像现在显示 React Native
- python - 计算新的分箱值列时出错
- .net - 使用现有 WSDL 文件在 .net core 3.1 下创建 Soap 服务
- node.js - 将 SSL 证书添加到 Angular 应用程序后,后端带有 expressJS 的 Angular 项目不起作用
- python - 将一个零从列表移到末尾,并将非零保留原样
- excel - 在excel中复制,重命名和验证多个文件和路径的成功
- netsuite - Netsuite 客户端脚本在某些项目添加到销售订单时创建弹出窗口