Gå ikke derhen.
ORA-04091: table XXXX is mutating
er generelt en god indikator for, at hvad end du forsøger at gøre, er for komplekst til at blive gjort pålideligt med udløsere.
Selvfølgelig kan du bruge en pakkearrayvariabel og en håndfuld triggere ( åh!) for at omgå denne fejl, men din kode vil højst sandsynligt:
- være uvedligeholdelig på grund af dens kompleksitet og den uforudsigelige karakter af triggere
- reagerer ikke godt på et flerbrugermiljø
Det er derfor, du bør genoverveje din tilgang, når du støder på denne fejl. Jeg råder dig til at opbygge et sæt procedurer pænt grupperet i en pakke for at håndtere sammenhængen mellem rækkerne. Tilbagekald alle rettigheder til at udføre DML tabellen direkte og brug kun disse procedurer til at ændre den.
For eksempel ville din opdateringsprocedure være en atomart proces, der ville:
- anskaffe en lås for at forhindre samtidige opdateringer på den samme gruppe af rækker (for eksempel lås værelsesposten i en hotelreservationsapplikation).
- kontroller, at den række, der skal indsættes, validerer al forretningslogik
- lav alle relevante DML
- tilbagefører alle dens ændringer (og kun dens ændringer -- ikke hele transaktionen) i tilfælde af fejl (let med PL/SQL, bare rejs en fejl).