【发布时间】:2019-08-24 20:49:13
【问题描述】:
我在 postgresql 中有一个触发器函数,它将在 INSERT、UPDATE 和 DELETE 操作的审计表中插入行。在我的表格中,有一个名为 audit_id 的列,我需要在此字段中写入插入的 audit 行的 ID。这是我的功能
CREATE OR REPLACE FUNCTION my_audit_trigger()
RETURNS trigger LANGUAGE plpgsql
AS $function$
declare
audit_pk bigint;
begin
IF TG_OP = 'INSERT'
THEN
INSERT INTO audit.table_audit (rel_id, table_name, operation, after)
VALUES (TG_RELID, TG_TABLE_NAME, TG_OP, to_jsonb(NEW)) returning id into audit_pk;
NEW.audit_id := audit_pk;
RETURN NEW;
ELSIF TG_OP = 'UPDATE'
THEN
IF NEW != OLD THEN
INSERT INTO audit.table_audit (rel_id, table_name, operation, before, after)
VALUES (TG_RELID, TG_TABLE_NAME, TG_OP, to_jsonb(OLD), to_jsonb(NEW)) returning id into audit_pk;
END IF;
NEW.audit_id := audit_pk;
RETURN NEW;
ELSIF TG_OP = 'DELETE'
THEN
INSERT INTO audit.table_audit (rel_id, table_name, operation, before)
VALUES (TG_RELID, TG_TABLE_NAME, TG_OP, to_jsonb(OLD)) returning id into audit_pk;
OLD.audit_id := audit_pk;
RETURN OLD;
END IF;
end;
$function$;
结果,当插入或更新我的表行时,我得到了相应操作的审计 ID,但是当我运行 DELETE 命令时,我得到了前一个操作的审计 ID,而不是 DELETE 本身的审计 ID。所以我猜问题出在OLD.audit_id := audit_pk;
更具体地说,例如,我运行 INSERT INTO table VALUES (this, that) RETURNING audit_id 并返回 INSERT 操作的 audit_id。
之后,在运行 DELETE FROM table WHERE id = sth RETURNING audit_id 时,我得到了 INSERT 操作的 audit_id,而不是 DELETE。
感谢您的帮助,谢谢。
附:这就是我创建触发器的方式
CREATE TRIGGER table_trigger
BEFORE INSERT OR UPDATE OR DELETE
ON table
FOR EACH ROW
EXECUTE PROCEDURE my_audit_trigger();
【问题讨论】:
-
我不太明白。你如何从
DELETE“取回”一些东西? -
欢迎来到 StackOverflow!您能否通过分享您看到的输出以及您的期望来改进您的问题?
-
当我运行 ``` DELETE FROM table WHERE id = 12 RETURNING * ``` 我得到了触发函数返回的一行
-
我们看不到返回到
audit_pk的id字段是如何获取其值的,因为插入语句中没有指定该字段。问题一定出在那儿 - 该值来自哪里,为什么将其设置为意外值?我在触发器本身看不到问题,它必须在该审计表中的实际数据中。请记住,插入或更新语句写入的甚至不是表,那么如何在affiliate_audit表中设置该值?只有您有权访问这些信息才能弄清楚。 -
@404 id 在审计表中的每个插入时自动生成。我认为那部分没问题,因为它完全符合 INSERT 和 UPDATE 的预期。运行 DELETE 时,OLD 包含要删除的整行,包括前一个操作的 audit_id。我想要做的是用一个新的更新旧的 audit_id 但这不起作用,我不知道为什么
标签: sql postgresql triggers sql-function postgresql-triggers