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; из-за этого вы получите ошибку изменяющейся таблицы, по крайней мере, если попытаетесь вставить / обновить несколько строк одновременно.

Другие вопросы по тегам