СОЗДАТЬ ФУНКЦИЮ ТРИГГЕРА И ТРИГГЕРА С РЕКУРСИВНЫМ И ЕСЛИ ЗАЯВЛЕНИЕМ - PullRequest
0 голосов
/ 23 марта 2020

Я хотел бы создать триггер, вызываемый перед вставкой в ​​мою базу данных.

Функция триггера проверяет одно условие.

  • , если условия выполняются:
    • НЕ МОЖЕТ вставить
  • остальное:
    • МОЖЕТ вставить

Для проверки моего состояния мне нужно RECURSIVITY Вот что я сделал:

CREATE OR REPLACE FUNCTION trigger_check_relation()
  RETURNS TRIGGER AS

$$BEGIN

    WITH RECURSIVE parent_list AS (

      SELECT relation.parent
      FROM relation
      WHERE relation.child = 9817

      UNION

      SELECT r.parent FROM relation r
        JOIN parent_list on parent_list.parent = r.child
    )
    SELECT name FROM component WHERE _id in (SELECT parent FROM parent_list);

    IF 9817 in (SELECT _id FROM component WHERE _id in (SELECT parent FROM parent_list))
        THEN RETURN OLD;
     ELSE 
        RETURN NEW;
     END IF;

END;$$ LANGUAGE plpgsql;

Я могу создать свой триггер и свою функцию, но при запуске он имеет:

ОШИБКА: у запроса нет места назначения для результата СОВЕТ данных: Если вы хотите отменить результаты SELECT, используйте вместо этого PERFORM. КОНТЕКСТ: PL / pg SQL function trigger_check_relation () строка 3 в SQL оператор SQL состояние: 42601

Не могли бы вы помочь мне разобраться и исправить эту проблему?

1 Ответ

0 голосов
/ 23 марта 2020

У вас есть два оператора в функции: первый - «WITH RECURSIVE parent_list… SELECT name FROM…», но он ничего не делает с результатом, таким как присвоение его переменной.

I Я думаю, что вам может понадобиться переместить предложение WITH в условие:

IF 9817 in (
  WITH RECURSIVE parent_list AS (

    SELECT relation.parent
    FROM relation
    WHERE relation.child = 9817

    UNION

    SELECT r.parent FROM relation r
      JOIN parent_list on parent_list.parent = r.child
  )
  SELECT _id FROM component
    WHERE _id in (SELECT parent FROM parent_list)
)
…
...