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

Interrompe l'operazione di inserimento/aggiornamento nel trigger utilizzando PL/SQL

Non andateci.

ORA-04091: table XXXX is mutating è generalmente un buon indicatore del fatto che qualsiasi cosa tu stia cercando di fare è troppo complessa per essere eseguita in modo affidabile con trigger.

Certo, potresti usare una variabile dell'array del pacchetto e una manciata di trigger ( eh!) per aggirare questo errore, ma molto probabilmente il tuo codice:

  • essere non mantenibile a causa della sua complessità e della natura imprevedibile dei trigger
  • non risponde bene a un ambiente multiutente

Questo è il motivo per cui dovresti ripensare al tuo approccio quando incontri questo errore. Ti consiglio di creare un insieme di procedure ben raggruppate in un pacchetto per gestire la coerenza tra le righe. Revocare tutti i privilegi per eseguire DML direttamente sulla tabella e utilizzare solo quelle procedure per modificarla.

Ad esempio, la tua procedura di aggiornamento sarebbe un atomico processo che sarebbe:

  1. acquisire un blocco per impedire l'aggiornamento simultaneo sullo stesso gruppo di righe (ad esempio bloccare il record della camera in un'applicazione di prenotazione di hotel).
  2. verifica che la riga da inserire convalidi tutte le logiche di business
  3. crea tutti i DML pertinenti
  4. Ripristina tutte le modifiche (e solo le modifiche, non l'intera transazione) in caso di errore (facile con PL/SQL, basta generare un errore).