Перед вставкой триггера - PullRequest
0 голосов
/ 10 июня 2011

Я хочу отключить перед вставкой триггера вставки в таблицу, когда выполняется какое-либо условие

 create or replace trigger CHECK_FOR_MAX_ENTRANTS
before insert on application
declare
    entrants_count number;
    max_entrants number;
begin
    select count(*) into entrants_count from application 
    where id_speciality = :new.id_speciality;

    select max_students_number into max_entrants from speciality s
    where s.id_speciality = :new.id_speciality;

    IF entrants_count >= max_entrants THEN
        **disable this insert**
end;

Как я могу это сделать?

Ответы [ 2 ]

3 голосов
/ 10 июня 2011

Если вы говорите об Oracle, тогда вместо отключите эту вставку вы можете:

IF entrants_count >= max_entrants THEN
    raise_application_error(-21010, 'Max number of Entrants Reached');
END IF;

См .: http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14261/errors.htm#sthref2006

РЕДАКТИРОВАТЬ: Обычно плохая идея, чтобы вставки молча терпели неудачу (то, что вы просите) Вы также можете столкнуться с ошибками изменяющейся таблицы, если попытаетесь удалить запись в триггере после вставки.

Вместо этого просто не вставляйте запись для начала. Один из способов добиться этого - добавить что-то вроде этого в конец оператора вставки:

WHERE EXISTS SELECT null FROM 
(SELECT COUNT(*) entrants_count FROM application 
WHERE id_speciality = :new.id_speciality) a,
(SELECT max_students_number max_entrants 
FROM speciality WHERE id_speciality = :new.id_speciality) s
WHERE a.entrants_count < s.max_entrants

Это должно только выполнить оператор вставки, когда entrants_count

2 голосов
/ 10 июня 2011

Попробуйте поднять ошибку:

IF entrants_count >= max_entrants THEN
  raise_application_error(-20001, 'Cannot perform this insert!');
END IF;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...