È noto (o almeno era noto) che non è possibile utilizzare le istruzioni DML su una tabella mutante all'interno di un trigger. Un estratto dalla documentazione di Oracle :
Una tabella mutante è una tabella che viene modificata da un'istruzione UPDATE, DELETE o INSERT o una tabella che potrebbe essere aggiornata dagli effetti di un vincolo DELETE CASCADE.
La sessione che ha emesso l'istruzione trigger non può eseguire query o modificare una tabella mutante. Questa restrizione impedisce a un trigger di vedere un insieme incoerente di dati.
Tuttavia, non riesco a capire perché questo trigger dimostrativo non stia fallendo con un errore di "tabella mutante" quando eseguo un insert into emp
utilizzo di SQL Developer o 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;
L'inserimento si completa correttamente con il id
valore successivo e aggiorna tutti i emp
record. Sto utilizzando Oracle Database 11g Enterprise Edition versione 11.2.0.1.0. Ho letto sui trigger composti ma il campione non li utilizza.
select max(id)
per assegnare numeri univoci. Non farlo. È semplicemente errato e non si ridimensionerà.