【问题标题】:Modify OLD to be returned by DELETE in postgresql trigger function修改 OLD 以在 postgresql 触发函数中由 DELETE 返回
【发布时间】: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_pkid 字段是如何获取其值的,因为插入语句中没有指定该字段。问题一定出在那儿 - 该值来自哪里,为什么将其设置为意外值?我在触发器本身看不到问题,它必须在该审计表中的实际数据中。请记住,插入或更新语句写入的甚至不是表,那么如何在affiliate_audit 表中设置该值?只有您有权访问这些信息才能弄清楚。
  • @404 id 在审计表中的每个插入时自动生成。我认为那部分没问题,因为它完全符合 INSERT 和 UPDATE 的预期。运行 DELETE 时,OLD 包含要删除的整行,包括前一个操作的 audit_id。我想要做的是用一个新的更新旧的 audit_id 但这不起作用,我不知道为什么

标签: sql postgresql triggers sql-function postgresql-triggers


【解决方案1】:

我也有类似的问题。看来 PG 现在只是不支持修改 OLD 了,不过这个功能很可能会被加入到 TODO 列表中。

目前您可以为 INSERT 和 UPDATE 语句修改 NEW

有关详细信息,请查看此邮件主题:Does 'instead of delete' trigger support modification of OLD

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-27
    相关资源
    最近更新 更多