Невозможно удалить запись в таблице PostgreSQL из-за триггера - PullRequest
2 голосов
/ 08 января 2020

Я хотел бы удалить запись внутри таблицы с триггером, подобным этому:

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, она возвращает ошибку, подобную этой:

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 у меня есть триггер, подобный этому:

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

1 Ответ

1 голос
/ 08 января 2020

Кто бы ни написал этот триггер, очевидно, допустил ошибку: NEW не определено в ON DELETE триггерах.

Лучшее решение - сбросить триггер и заново создать его с помощью ON INSERT OR UPDATE.

Чтобы временно не запускать триггеры, вы можете установить session_replication_role на replica. Имейте в виду, что это также отключает ограничения внешнего ключа и поэтому может быть изменено только суперпользователями.

...