Postgres函数用于创建引发错误的审计表INSERT的表达式比目标列多



我有一个包含id、status和dateadded的表。Id和dateadded分别默认为整数nextval和current_timestamp。然后我有一个触发器,它调用Insert、Update或Delete上的函数。在该功能中,它所做的只是备份和跟踪状态表中的更改。当有多个字段被添加到表中时,此方法成功工作。对于状态表,我只添加了状态字段,并让数据库处理其他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);

最新更新