由于触发器,无法删除 PostgreSQL table 中的记录

Cannot delete record in PostgreSQL table due to trigger

我想删除 table 中的一条记录,它有这样的触发器:

CREATE OR REPLACE FUNCTION public.notify_trigger()
  RETURNS trigger AS
$BODY$
DECLARE
BEGIN
  PERFORM pg_notify('watchers', 
    '{' ||
      '"table":"'    || TG_TABLE_NAME || '",' ||
      '"operation":"'|| TG_OP         || '",' ||
      '"row":'       || (select row_to_json(row)::varchar from (SELECT NEW.*) row) ||
    '}'
  );
  RETURN NEW;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION public.notify_trigger()
  OWNER TO postgres;

当我尝试使用 delete from test_notify where id = 1277 删除记录时,它 returns 出现如下错误:

ERROR:  record "new" is not assigned yet
DETAIL:  The tuple structure of a not-yet-assigned record is indeterminate.
CONTEXT:  SQL statement "SELECT pg_notify('watchers', 
    '{' ||
      '"table":"'    || TG_TABLE_NAME || '",' ||
      '"operation":"'|| TG_OP         || '",' ||
      '"row":'       || (select row_to_json(row)::varchar from (SELECT NEW.*) row) ||
    '}'
  )"
PL/pgSQL function notify_trigger() line 4 at PERFORM

********** Error **********

test_notify table 我有一个这样的触发器:

CREATE TRIGGER watched_table_trigger
  AFTER INSERT OR UPDATE OR DELETE
  ON public.test_notify
  FOR EACH ROW
  EXECUTE PROCEDURE public.notify_trigger();

写触发器的人显然犯了一个错误:NEW 未在 ON DELETE 触发器中定义。

最好的解决方案是删除触发器并使用 ON INSERT OR UPDATE 重新创建它。

要暂时阻止触发器触发,您可以将 session_replication_role 设置为 replica。请注意,这也会禁用外键约束,因此只能由超级用户更改。