首页 > 解决方案 > 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;

非常感谢任何帮助。

标签: sqlpostgresqlfunctiondatabase-triggersql-function

解决方案


插入失败,因为您为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);

推荐阅读