sql >> Database >  >> RDS >> PostgreSQL

Transactie terugdraaien bij triggerfout

Een paar problemen met je triggerfunctie:

  • Gebruik IF EXISTS (...) THEN in plaats van alle gebeurtenissen te tellen. Sneller, eenvoudiger. Zie:

  • Een triggerfunctie AFTER INSERT OR UPDATE kan gewoon NULL retourneren . RETURN NEW is alleen relevant voor triggers genaamd BEFORE . De handleiding :

  • Onevenwichtige enkele quote.

  • Zoals @Pavel uitgelegd , kunt u transacties niet beheren vanuit een plpgsql-functie. Elke onverwerkte uitzondering dwingt uw hele transactie automatisch terug te draaien. Dus verwijder gewoon de EXCEPTION blok.

Je hypothetische trigger herschreven:

CREATE OR REPLACE FUNCTION check_room()
  RETURNS TRIGGER AS
$func$
BEGIN
   IF EXISTS (
         SELECT FROM "Sesion"    -- are you sure it's not "Session"?
         WHERE  "Room_Name" = NEW."Room_Name"
         AND    "Date" = NEW."Date") THEN
     RAISE EXCEPTION 'The room is rented at that date';
   END IF;
   RETURN NULL;
END
$func$  LANGUAGE plpgsql;

Een BEFORE trigger is logischer.

Maar a UNIQUE INDEX ON ("Room_Name", "Date") hetzelfde zou doen, efficiënter. Vervolgens genereert elke regel in overtreding een dubbele sleuteluitzondering en wordt de transactie teruggedraaid (tenzij gevangen en afgehandeld). In het moderne Postgres kunt u dergelijke INSERT . ook overslaan of omleiden pogingen met INSERT ... ON CONFLICT ... . Zie:

Geavanceerd gebruik:



  1. MySQL + htaccess mod_rewrite?

  2. Converteer keep density_rank van Oracle-query naar postgre

  3. DROP-FUNCTIE zonder het aantal/type parameters te kennen?

  4. Kan PostgreSQL niet installeren:er is een fout opgetreden bij het uitvoeren van het Microsoft VC++ runtime-installatieprogramma op Windows XP