sql - Postgres 函数创建审计表抛出错误 INSERT has more expressions than target columns
问题描述
我有一个包含 id、status、dateadded 的表。Id 和 dateadded 分别默认为整数 nextval 和 current_timestamp。然后我有一个触发器,它调用插入、更新或删除的函数。在该功能中,它所做的只是备份并跟踪状态表中的更改。当向表中添加多个字段时,此方法成功。使用状态表,我只添加状态字段并让数据库处理其他 2 个字段,我收到错误。看起来我可能需要在函数中做一些不同的事情?我正在使用 python 将数据添加到这些表中以实现自动化,并尝试手动将记录添加到表中,但出现了相同的错误。
Error while fetching data from PostgreSQL INSERT has more expressions than target columns
LINE 2: (TG_OP, NEW.*)
^
QUERY: INSERT INTO api_audit.d_status_list (id, status, dateadded) VALUES
(TG_OP, NEW.*)
CONTEXT: PL/pgSQL function api_input.d_status_list_func() line 4 at SQL statement
功能代码:
create function d_status_list_func() returns trigger
language plpgsql
as
$$
BEGIN
IF TG_OP = 'INSERT' THEN
INSERT INTO api_audit.d_status_list (id, status, dateadded) VALUES
(TG_OP, NEW.*);
RETURN NEW;
ELSIF TG_OP = 'UPDATE' THEN
INSERT INTO api_audit.d_status_list (id, status, dateadded) VALUES
(TG_OP, NEW.*);
RETURN NEW;
ELSIF TG_OP = 'DELETE' THEN
INSERT INTO api_audit.d_status_list (id, status, dateadded) VALUES
(TG_OP, OLD.*);
RETURN OLD;
END IF;
END;
$$;
alter function d_status_list_func() owner to blahblah;
非常感谢任何帮助。
解决方案
插入失败,因为您为insert
( id, status, dateadded
) 声明了三列,但您给它提供了 4 个值:操作(插入、更新、删除),然后是 3 个原始列。
大概,您的审计表有(或应该有)一个存储正在执行的操作的列。
insert
如果是这样,您应该在语句中列出该列:
INSERT INTO api_audit.d_status_list (operation, id, status, dateadded)
VALUES (TG_OP, NEW.*);
一般来说,避免*
并明确列出列是一种很好的做法,这样在出错时更容易追踪,所以:
INSERT INTO api_audit.d_status_list (operation, id, status, dateadded)
VALUES (TG_OP, NEW.id, NEW.status, NEW.dateadded);
推荐阅读
- javascript - 使用jQuery滚动时如何为每个锚点设置不同的偏移量
- ubuntu - 您在哪里找到您的 IDE 或工作区?
- typescript - *.d.ts 文件有什么用?
- sql-server - 如何解析 MSsql 字符串
- haproxy - 通过从 haproxy 中的列表文件中动态匹配 url 和方法类型来定义 ACL
- spring-tool-suite - STS用java 1.6版本?
- python-3.x - python识别文本中的簇
- sql - SQL server服务重启后等待任务正常down
- python - 带有轴参数的Tensorflow tf.gather
- r - 日志背景渐变ggplot