Oracle
 sql >> Database >  >> RDS >> Oracle

Errore di mutazione dopo l'inserimento del trigger

In Oracle ci sono due livelli di trigger:livello riga e livello tabella.

I trigger a livello di riga vengono eseguiti for each row . Trigger a livello di tabella eseguiti per istruzione, anche se un'istruzione è cambiata più di una riga.
In un trigger a livello di riga, non puoi selezionare/aggiornare la tabella stessa che ha il trigger:otterrai un errore mutante.

In questo caso, non è necessaria un'istruzione UPDATE. Prova questo:

CREATE OR REPLACE TRIGGER aso_quote_cuhk_trigger
BEFORE INSERT
ON aso.aso_quote_headers_all
FOR EACH ROW
BEGIN
 :new.quote_expiration_date=sysdate+90;     
END;
/

MODIFICA Rajesh ha detto che è possibile che prima di inserire una nuova riga, OP desideri aggiornare tutti gli altri record in aso_quote_headers_all tabella.

Bene, questo è fattibile, ma è un po' complicato. Per farlo correttamente, avrai bisogno di

  1. Un pacchetto pl/sql e una variabile nell'intestazione del pacchetto che viene modificata dai trigger. Questa variabile potrebbe essere un elenco contenente gli ID dei record appena inseriti. Il livello di riga dopo l'inserimento del trigger aggiungerebbe un nuovo ID all'elenco. Il contenuto di questa variabile del pacchetto sarà diverso per ogni diversa sessione, quindi chiamiamo questa variabile session_variable .
  2. Livello di riga dopo l'inserimento del trigger, che aggiungerebbe un nuovo ID alla session_variable .
  3. Livello di tabella dopo l'inserimento del trigger che otterrebbe gli ID dalla session_variable , elabora l'ID e poi rimuovilo dalla session_variable . Questo trigger potrebbe eseguire selezioni/aggiornamenti necessari su aso_quote_headers_all. Dopo che un ID appena inserito è stato elaborato, questo attivatore dovrebbe assicurarsi che venga rimosso dalla session_variable .