Ошибка из функции триггера: ОШИБКА: столбец не существует - PullRequest
0 голосов
/ 02 июня 2019

Я создал триггер:

CREATE OR REPLACE FUNCTION public.delete_user() 
 RETURNS TRIGGER AS $func$
BEGIN
    EXECUTE format('UPDATE public.user SET %I = %L WHERE state = %L', 
    "state", "active", "deleted");
END;
$func$ LANGUAGE plpgsql;

 CREATE TRIGGER deleted_user
    AFTER UPDATE ON public.user
      FOR EACH ROW
      WHEN (OLD.state IS DISTINCT FROM NEW.state)
      EXECUTE PROCEDURE delete_user();

чем после запуска:

update public.user set state = 'active' where fullname = '1234'

Я получаю ошибку:

> ERROR:  column "state" does not exist
> LINE 1: ...UPDATE public.user SET %I = %L WHERE state = %L', "state", "...
>                                                              ^
> QUERY:  SELECT format('UPDATE public.user SET %I = %L WHERE state = %L', "state", "active", "deleted")
> CONTEXT:  PL/pgSQL function delete_user() line 3 at EXECUTE SQL state: 42703

Вот как состояние определяется в пользовательской таблице:

state text COLLATE pg_catalog."default" NOT NULL DEFAULT 'active'::text,

Я новичок в Postgres, так что, думаю, это синтаксическая ошибка?

1 Ответ

0 голосов
/ 03 июня 2019

Это будет работать :

CREATE OR REPLACE FUNCTION public.delete_user() 
  RETURNS TRIGGER AS
$func$
BEGIN
  EXECUTE format('UPDATE public.user SET %I = %L WHERE state = %L', 
  'state', 'active', 'deleted');

  RETURN NULL;  -- or OLD (for AFTER trigger)
END
$func$ LANGUAGE plpgsql;

Одиночные кавычки для строковых литералов вместо двойных кавычек (для идентификаторов).Для этого вам не нужен динамический SQL, и вы можете упростить:

CREATE OR REPLACE FUNCTION public.delete_user() 
  RETURNS TRIGGER AS
$func$
BEGIN
  UPDATE public.user SET state = 'active' WHERE state = 'deleted';

  RETURN NULL;
END
$func$  LANGUAGE plpgsql;

Хотя синтаксис работает и сейчас, он приводит к бесконечному циклу и не имеет смысла как есть.Я не уверен, куда вы идете с этим.

Связанный:

В стороне: public.user работает, так как квалификация схемы устраняет неоднозначность, но пустое имя таблицы userвсегда требует двойных кавычек: "user". Никогда использовать зарезервированные слова, такие как user в качестве идентификатора.

...