Как предотвратить вставку данных в Oracle Ocl с помощью триггеров - PullRequest
0 голосов
/ 07 мая 2018

У меня есть таблица с именем FACULTY, которая имеет столбец с именем F_RANK и содержит тип данных char. Правило состоит в том, что таблица FACULTY НЕ МОЖЕТ иметь более двух профессоров с рангом F_RANK = 'Full'. Таким образом, если новый профессор вставлен в таблицу с «Полным» ИЛИ один из существующих профессоров F_RANK обновляется до «Полного», он должен запустить триггер, который проверяет общее количество профессоров с «Полным», и если это уже 2 , он должен отклонить вставку.

Я начал писать триггер для него, но остановился на полпути, потому что не знаю, как с ним справиться.

Вот мой код.

create or replace TRIGGER TRG_ONLYTWOPROF
BEFORE INSERT OR UPDATE OF F_RANK ON FACULTY
DECLARE 
TOTAL NUMBER(4);
BEGIN
SELECT COUNT(F_RANK) INTO TOTAL 
FROM FACULTY
WHERE F_RANK = 'Full';
IF :NEW.F_RANK = 'Full' THEN
-- check if total is less than 2
   -- if it is, accept insertion
   -- else reject insertion of the row
ELSE
-- accept insertion of the row
-- or accept update of existing row on F_RANK column
END;
/

Может кто-нибудь помочь мне в этом? Заранее спасибо.

1 Ответ

0 голосов
/ 07 мая 2018

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

create or replace TRIGGER TRG_ONLYTWOPROF
  AFTER INSERT OR UPDATE OF F_RANK ON FACULTY
DECLARE 
  TOTAL NUMBER(4);
BEGIN
  SELECT COUNT(*)
    INTO TOTAL 
    FROM FACULTY
    WHERE F_RANK = 'Full';

  IF TOTAL > 2 THEN
    RAISE_APPLICATION_ERROR(-20001, 'Failure in trigger TR_ONLYTWOPROF: two professors with RANK=''Full'' already exist');
  END IF;
END TRG_ONLYTWOPROF;

Определяет триггер оператора, который будет запускать после , когда произошла INSERT или UPDATE. Одна из проблем заключается в том, что триггер оператора не может видеть значения строк, поэтому вы не можете пропустить проверку, если новая строка имеет F_RANK, отличный от 'Full'. Не должно иметь большого значения, но должно иметь в виду. Другая причина в том, что, поскольку вы не можете видеть значения строк, вам необходимо выполнить проверку после , когда оператор вступил в силу, чтобы вы могли правильно вызвать исключение.

Удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...