Sql 用于创建审核表的Postgres函数抛出错误插入的表达式多于目标列

Sql 用于创建审核表的Postgres函数抛出错误插入的表达式多于目标列,sql,postgresql,function,database-trigger,sql-function,Sql,Postgresql,Function,Database Trigger,Sql Function,我有一个包含id、status、dateadded的表。Id和dateadded分别默认为整数nextval和当前_时间戳。然后我有一个触发器,在插入、更新或删除时调用函数。 在函数中,它所做的只是备份和跟踪状态表中的更改。当有多个字段被添加到表中时,此方法成功运行。对于status表,我只添加status字段,让db处理其他2个字段,然后我收到了错误。 看起来我可能需要在函数中执行一些不同的操作? 我正在使用python向这些表中添加数据以实现自动化,并尝试手动向表中添加记录,但出现了相同的错

我有一个包含id、status、dateadded的表。Id和dateadded分别默认为整数nextval和当前_时间戳。然后我有一个触发器,在插入、更新或删除时调用函数。 在函数中,它所做的只是备份和跟踪状态表中的更改。当有多个字段被添加到表中时,此方法成功运行。对于status表,我只添加status字段,让db处理其他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个值:操作(insert、update、delete),然后是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);

插入失败,因为您正在为
insert
id、status、dateadded
)声明三列,但您给了它四个值:操作(insert、update、delete),然后是三个原始列

您的审计表可能有(或应该有)一列存储正在执行的操作

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