Триггер уровня строки в таблице A (т. Е. Library.borrows) не может запросить таблицу A. Если вы это сделаете, вы получите исключение мутирующей таблицы (если только вы не можете гарантировать, что вы когда-либо будете выполнять вставку только одной строки спункт ЗНАЧЕНИЯ).Так что это не будет считаться хорошей практикой разработки в Oracle.
Наиболее логичным способом реализации такого рода требований не является использование триггера.Вместо этого, если ваше приложение вызывает API хранимых процедур, у вас будет хранимая процедура (например, CHECK_OUT), которая сначала запрашивает таблицу, чтобы определить, сколько книг было извлечено отдельным человеком, и вставляет строку в таблицу BORROWS, только если посетитель находится нижеего или ее предел.
Второй подход заключается в сохранении количества пунктов, извлеченных в отдельной таблице.Если у вас была таблица PATRONS со столбцом NUM_CHECKED_OUT, а в таблице BORROWS был PATRON_ID, указывающий, кто заимствовал книгу, ваш триггер может сделать что-то вроде
CREATE OR REPLACE TRIGGER CheckBorrowsTable
BEFORE INSERT ON library.borrows
FOR EACH ROW
BEGIN
UPDATE patrons p
SET p.num_checked_out = p.num_checked_out + 1
WHERE p.patron_id = :new.patron_id
END;
вместе с ограничением CHECK для таблицы PATRONS, чтобыубедитесь, что NUM_CHECKED_OUT никогда не превышает 3.
За исключением того, что возможно, хотя и довольно обременительно, обойти ошибку таблицы мутаций с помощью "решения трех триггеров".
- A ДОТриггер уровня инструкции INSERT очищает коллекцию, созданную в пакете.
- ПЕРЕД триггером уровня строки INSERT записывается первичный ключ (или ROWID) изменяемой строки в коллекцию.
- Триггер уровня оператора AFTER INSERT считывает данные из коллекции, запрашивает таблицу и определяет, нарушает ли какая-либо из вставок бизнес-правило.Если они это сделали, выведите исключение.
Как вы можете себе представить, однако, триггерное решение включает в себя достаточное количество движущихся фигур, поэтому это не особенно рекомендуется.
Вы также можетереализовать такие вещи с помощью быстро обновляемого материализованного представления, но я не верю, что это вариант в экспресс-редакции базы данных (хотя я могу ошибаться в этом).