用于创建审计的 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);
我有一个 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);