sql - postgresql触发器函数中修改OLD为DELETE返回

标签 sql postgresql triggers sql-function postgresql-triggers

我在 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();           

最佳答案

我有类似的问题。看来PG现在只是不支持修改OLD,但是,这个特性可能会被包含到TODO列表中。

目前您只能修改 NEW 的 INSERT 和 UPDATE 语句

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

关于sql - postgresql触发器函数中修改OLD为DELETE返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55493205/

相关文章:

c# - 谁能告诉我为什么这个 SQL 查询不起作用

sql - 在 Postgres 中使用带有聚合和分组的子查询进行更新

macos - Mac OS X Snow Leopard 的默认/etc/sysctl.conf 设置?

jquery-ui - 以编程方式将项目从一个可排序连接列表移动到另一个

sql - 使用递增引用更新 postgresql 表列

c# - 将列表框中的所有数据移动到数据库中的表中

php - 针对 mysql 触发器进行计算

php - 在MySQL中使用触发器插入数据库后我可以获得主键值和扩展名吗

sql - 这个sql语句是什么意思(order by count(*))?

sql - 加入派生表postgres