Триггер в postgres для блокировки таблицы со списком - PullRequest
0 голосов
/ 26 мая 2020

У меня проблема с триггерами с PostgreSQL 10. Вот ситуация. У меня есть таблица с именем index_name, которая содержит столбец с именем index_ref. В этом поле я создал список значений в качестве примера: PBM PI, PBM PO, et c. Я хотел бы использовать эту таблицу для хранения действительного имени в качестве ссылки для другой таблицы с именем gis_osm_places. Итак, всякий раз, когда кто-то пытается вставить значение не в список, появится сообщение об исключении, в котором говорится: НЕ ДОПУСКАЕТСЯ ОБЯЗАТЕЛЬСТВО. ПОЖАЛУЙСТА, ИСПОЛЬЗУЙТЕ: (список ссылок) Вот мои таблицы: enter image description here Вот где я нахожусь с триггером:

CREATE FUNCTION public.check_column_value()
    RETURNS trigger
    LANGUAGE 'plpgsql'
    COST 100
    VOLATILE NOT LEAKPROOF

AS $BODY$

DECLARE
ref_allowed character varying;
BEGIN

IF TG_OP = 'INSERT' OR TG_OP = 'UPDATE'
THEN

IF NEW.index_a is not null OR NEW.index_a NOT IN (SELECT index_ref from public.index_name)
THEN

ref_allowed := (SELECT string_agg(index_ref,',') from public.index_name);
RAISE EXCEPTION 'NOT ALLOWED COMMIT. PLEASE USE : %',ref_allowed;

END IF;
RETURN NEW;

END IF;
END;

$BODY$;

ALTER FUNCTION public.check_column_value()
    OWNER TO "postgres";

CREATE TRIGGER check_column_value
    BEFORE INSERT
    ON public.gis_osm_places
    FOR EACH ROW
    EXECUTE PROCEDURE public.check_column_value();

На самом деле ничего не происходит, я имею в виду, что я могу добавить все, что захочу, без ошибок. Мы будем очень признательны за любую идею или обновление кода. Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 28 мая 2020

Наконец-то я нашел, что пошло не так!

CREATE FUNCTION public.check_column_value()
    RETURNS trigger
    LANGUAGE 'plpgsql'
    COST 100
    VOLATILE NOT LEAKPROOF

AS $BODY$

DECLARE
ref_allowed character varying;
BEGIN

IF TG_OP = 'INSERT' OR TG_OP = 'UPDATE'
THEN

IF NEW.index_a is not null AND NEW.index_a NOT IN (SELECT index_ref from public.index_name)
THEN

ref_allowed := (SELECT string_agg(index_ref,',') from public.index_name);
RAISE EXCEPTION 'NOT ALLOWED COMMIT. PLEASE USE : %',ref_allowed;

END IF;
RETURN NEW;

END IF;
END;

$BODY$;

ALTER FUNCTION public.check_column_value()
    OWNER TO "postgres";

CREATE TRIGGER check_column_value
    BEFORE INSERT OR UPDATE
    ON public.gis_osm_places
    FOR EACH ROW
    EXECUTE PROCEDURE public.check_column_value();
0 голосов
/ 28 мая 2020

Вам не нужен и не нужен триггер для этого. Эта функция встроена. Просто создайте ограничение внешнего ключа для gis_osm_places, ссылаясь на index_name.

alter table gis_osm_places 
  add constraint osm_places2index_fk 
      foreign key (index_a)
      references index_name(index_ref);

Теперь отбросьте ваш триггер и функцию триггера. Обратной стороной является то, что вы не получаете сообщение, которое создали. Но вы обрабатываете это при обработке исключений в своем приложении.

...