Відомо (або, принаймні, було) відомо, що ви не можете використовувати оператори DML у мутаційній таблиці всередині тригера. Витяг з документації Oracle :
Таблиця, що мутує, - це таблиця, яка модифікується оператором UPDATE, DELETE або INSERT, або таблиця, яка може бути оновлена ефектами обмеження DELETE CASCADE.
Сеанс, який видав оператор запуску, не може запитувати або змінювати мутуючу таблицю. Це обмеження не дозволяє тригеру бачити непослідовний набір даних.
Однак я не можу зрозуміти, чому цей демо-тригер не виходить із помилкою "мутаційна таблиця", коли я виконую за insert into emp
допомогою SQL Developer або SQL * Plus:
CREATE OR REPLACE TRIGGER emp_bri
BEFORE INSERT ON emp
FOR EACH ROW
BEGIN
SELECT max(id) + 1 INTO :NEW.id FROM emp;
UPDATE emp SET salary = 5000;
END emp_bri;
Вставка успішно завершується наступним id
значенням та оновлює всі emp
записи. Я використовую Oracle Database 11g Enterprise Edition випуску 11.2.0.1.0. Я читав про складні тригери, але зразок не використовує їх.
select max(id)
для призначення унікальних номерів. Просто ні. Це просто неправильно, і він також не буде масштабуватися.