Объявите переменную как ROWTYPE - функция триггера - PullRequest
0 голосов
/ 23 ноября 2018

В этой задаче я создал таблицу с именем groups (id, name, group_id INTEGER NULLABLE, class_id INTEGER NULLABLE), логика заключается в классификации данных между группами, классами и подклассами.Группа имеет много классов, а класс имеет много подклассов.Я подумал сделать триггерную функцию в plpgsql, которая гарантирует некоторые условия перед вставкой или обновлением данных.

Условия для классификации данных приведены ниже.

  • Группы:
    пользователь должен вставить только значение name .
    group_id и clazz_id должны иметь значения NULL.

  • Классы:
    пользователь должен вставить только значения name и group_id .
    group_id должно быть значением INTEGER NOT NULL, а clazz_id является значением NULL.
    group_id должны соответствовать условиям для классификации в группу.

  • Подклассы:
    Пользователь должен вставить только name , group_id и clazz_id ценности.Таким образом, вы можете установить значение group_id , равное group_id , которое принадлежит clazz_id , чтобы гарантировать, что условие выполнено.
    group_id должен совпадать с group_id с установленным class_id .
    clazz_id должен соблюдать условия для классификации в качестве класса.

.

CREATE FUNCTION emp_subclasse() RETURNS trigger AS $subclasse_verification$
DECLARE
  group groups%ROWTYPE;
  classe groups%ROWTYPE;
  class_group groups%ROWTYPE;
BEGIN
  group =(SELECT * FROM groups WHERE id=NEW.group_id);
  classe =(SELECT * FROM groups WHERE id=NEW.clazz_id);
  class_group =(SELECT * FROM groups WHERE id=classe.group_id);
  IF NEW.clazz_id IS NOT NULL THEN
      IF (classe.group_id) IS NULL THEN
          RAISE EXCEPTION 'A CLASS MUST POINT TO A GROUP';
      ELSIF classe.group_id IS NOT NULL THEN
          NEW.group_id = classe.group_id;
          IF class_group.group_id IS NOT NULL OR class_group.clazz_id IS NOT NULL THEN
              RAISE EXCEPTION 'A GROUP CANNOT HAVE A GROUP_ID OR CLASS_ID POINTED';
          END IF;
      END IF;
      IF classe.clazz_id IS NOT NULL THEN
          RAISE EXCEPTION 'CANNOT CLASSIFY A CLASS AS A SUBCLASS';
      END IF;
  ELSIF NEW.clazz_id IS NULL THEN
      IF NEW.group_id IS NOT NULL THEN
          IF group.group_id IS NOT NULL OR grupo.clazz_id IS NOT NULL THEN
              RAISE EXCEPTION 'A GROUP CANNOT HAVE A GROUP_ID OR CLASS_ID POINTED';
          END IF;
      END IF;
  END IF;
END;
$subclasse_verification$ LANGUAGE 'plpgsql';

CREATE TRIGGER subclasse_verification BEFORE INSERT OR UPDATE ON groups
  FOR EACH ROW EXECUTE PROCEDURE emp_subclasse();

Однако, когда япопробуй вставить значения, получаю ошибку [2018-11-20 16:35:20] [42601] ERROR: subquery must return only one column [2018-11-20 16:35:20] WHERE: PL/pgSQL function emp_subclasse() line 7 at assignment

1 Ответ

0 голосов
/ 23 ноября 2018
  group =(SELECT * FROM groups WHERE id=NEW.group_id);
  classe =(SELECT * FROM groups WHERE id=NEW.clazz_id);
  class_group =(SELECT * FROM groups WHERE id=classe.group_id);

Эти подзапросы возвращают все столбцы (SELECT *).Чтобы правильно заполнить переменные, выберите строку без расширения: group := (SELECT groups FROM groups WHERE ...) или выполните команду SELECT INTO: SELECT * INTO group FROM groups WHERE ...

...