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

Mutationsfejl på efter indsættelsesudløser

I oracle er der to niveauer af triggere:rækkeniveau og tabelniveau.

Udløsere på rækkeniveau udføres for each row . Tabelniveauudløsere udført pr. sætning, selvom en sætning ændrede sig mere end én række.
I en trigger på rækkeniveau kan du ikke vælge/opdatere selve tabellen, der har triggeren:du får en mutationsfejl.

I dette tilfælde er der ikke behov for en UPDATE-sætning. Prøv bare dette:

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;
/

REDIGER Rajesh nævnte, at det er muligt, at OP inden indsættelse af en ny række ønsker at opdatere alle andre poster i aso_quote_headers_all tabel.

Nå, det er muligt, men det er lidt vanskeligt. For at gøre dette korrekt, skal du bruge

  1. En pl/sql-pakke og en variabel i pakkehovedet, der er ændret af triggerne. Denne variabel kunne være en liste med ID'erne for nyligt indsatte poster. Rækkeniveau efter indsæt trigger ville tilføje et nyt ID til listen. Indholdet af denne pakkevariabel vil være forskellig for hver anden session, så lad os kalde denne variabel session_variable .
  2. Rækkeniveau efter indsæt trigger, som ville tilføje nyt id til session_variable .
  3. Tabelniveau efter indsæt trigger, der ville få id'er fra session_variable , behandle ID'et og derefter fjerne det fra session_variable . Denne trigger kunne udføre nødvendige valg/opdateringer på aso_quote_headers_all. Når et nyligt indsat id er behandlet, bør denne trigger sørge for, at den bliver fjernet fra session_variable .


  1. En ny måde at personliggøre din PostgreSQL-overvågning med Prometheus

  2. Sætter dataene, der er sendt til xargs, to gange på én linje

  3. MySQL 5.7:konverter simpel JSON_ARRAY til rækker

  4. Hvordan kontrollerer man rollen for den nuværende PostgreSQL-bruger fra Qt-applikationen?