SQL Raise Ошибка запуска приложения
Это выдает "Ошибка: ORA-04082: НОВЫЕ или СТАРЫЕ ссылки не разрешены в триггерах уровня таблицы"
Я не уверен, где я иду не так. Номер ошибки не должен иметь значения, не так ли?
CREATE OR REPLACE TRIGGER REJECTION
BEFORE INSERT OR UPDATE ON TEA_PREFS_T
DECLARE temp NUMBER;
BEGIN
SELECT COUNT(*) INTO temp FROM tea_prefs_t WHERE person = :new.drinkerid;
IF (temp >=10) THEN
raise_application_error(-20101, 'ERROR: CANNOT INSERT MORE THAN 10');
ROLLBACK;
END IF;
END;
1 ответ
Как показывает ошибка, вы можете ссылаться только на новые и старые псевдоряды в триггере уровня строки, а не на триггер уровня таблицы, который срабатывает один раз, независимо от того, сколько строк было затронуто оператором. Если бы вы обновили две строки с разными идентификаторами пьющего, какое значение будет использовать триггер для его поиска?
Чтобы сделать его триггером уровня строки, добавьте FOR EACH ROW
:
CREATE OR REPLACE TRIGGER REJECTION
BEFORE INSERT OR UPDATE ON TEA_PREFS_T
FOR EACH ROW
DECLARE
temp NUMBER;
BEGIN
SELECT COUNT(*) INTO temp FROM tea_prefs_t WHERE person = :new.drinkerid;
IF (temp >=10) THEN
raise_application_error(-20101, 'ERROR: CANNOT INSERT MORE THAN 10');
END IF;
END;
/
Вы не можете зафиксировать или откатить изнутри триггера; транзакция делает вставку / обновление, чтобы решить, делать ли это.
Однако вы также не можете выбрать из той же таблицы, которую вставляете в /update; из-за этого вы получите ошибку изменяющейся таблицы, по крайней мере, если попытаетесь вставить / обновить несколько строк одновременно.