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