Du använder en autonom transaktion för att kringgå det faktum att en utlösare inte kan fråga sin tabell själv. Du har stött på det ökända mutationstabellfelet och du har upptäckt att om du deklarerar utlösaren som en autonom transaktion försvinner felet.
Ingen tur för dig dock, detta löser inte problemet alls:
- För det första går all transaktionslogik förlorad. Du kan inte återställa ändringarna på
suscription_fact
tabell, är de engagerade , medan din huvudsakliga transaktion inte är och skulle kunna återställas. Så du har också förlorat din dataintegritet. - Utlösaren kan inte se den nya raden eftersom den nya raden inte har registrerats än! Eftersom utlösaren körs i en oberoende transaktion kan den inte se de oengagerade ändringarna som görs av huvudtransaktionen:du kommer att stöta på helt felaktiga resultat.
Det är därför du aldrig bör göra någon affärslogik i autonoma transaktioner. (det finns legitima applikationer men de är nästan helt begränsade till loggning/felsökning).
I ditt fall bör du antingen:
- Uppdatera din logik så att den inte behöver fråga din tabell (uppdatera
suscription_fact
endast om den nya raden är nyare än det gamla värdet lagrat iid_date_unsuscription
). - Glöm bort att använda affärslogik i triggers och använd en procedur som uppdaterar alla tabeller korrekt eller använd en vy för här har vi ett tydligt fall av redundant data.
- Använd en lösning som faktiskt fungerar (av Tom Kyte) .
Jag rekommenderar starkt att du använder (2) här. Använd inte triggers för att koda affärslogik. De är svåra att skriva utan buggar och ännu svårare att underhålla. Att använda en procedur garanterar att all relevant kod är samlad på ett ställe (ett paket eller en procedur), lätt att läsa och följa och utan oförutsedda konsekvenser.