用于创建审计的 Postgres 函数 table 抛出错误 INSERT 的表达式多于目标列

Postgres function to create audit table throwing error INSERT has more expressions than target columns

我有一个 table 包含 id、status、dateadded。 Id 和 dateadded 分别默认为整数 nextval 和 current_timestamp。然后我有一个触发器调用插入、更新或删除函数。 在函数中它所做的只是备份和跟踪状态的变化table。当有多个字段被添加到 table 时,此方法成功运行。使用状态 table 我只添加状态字段并让数据库处理其他 2 个字段,我收到错误。 看起来我可能需要在函数中做一些不同的事情? 我正在使用 python 将数据添加到这些 table 以实现自动化,并尝试手动将记录添加到 table 并发生相同的错误。

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 个原始值列。

据推测,您的审计 table 有(或应该有)一列存储正在执行的操作。

如果是这样,您应该在 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);