PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Rollback-Transaktion bei Trigger ERROR

Ein paar Probleme mit Ihrer Trigger-Funktion:

  • Verwenden Sie IF EXISTS (...) THEN anstatt alle Vorkommen zu zählen. Schneller, einfacher. Siehe:

  • Eine Auslösefunktion AFTER INSERT OR UPDATE kann nur NULL zurückgeben . RETURN NEW ist nur relevant für Trigger namens BEFORE . Das Handbuch :

  • Unausgeglichenes einfaches Anführungszeichen.

  • Wie @Pavel erklärt , können Sie Transaktionen nicht innerhalb einer plpgsql-Funktion steuern. Jede nicht behandelte Ausnahme erzwingt ein automatisches Zurücksetzen Ihrer gesamten Transaktion. Entfernen Sie also einfach die EXCEPTION blockieren.

Ihr hypothetischer Auslöser umgeschrieben:

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;

Ein BEFORE Trigger macht mehr Sinn.

Aber ein UNIQUE INDEX ON ("Room_Name", "Date") würde das gleiche tun, effizienter. Dann löst jede Zeile, die gegen sie verstößt, eine Ausnahme bei doppeltem Schlüssel aus und setzt die Transaktion zurück (sofern sie nicht abgefangen und behandelt wird). In modernem Postgres können Sie solche INSERT alternativ überspringen oder umleiten Versuche mit INSERT ... ON CONFLICT ... . Siehe:

Erweiterte Nutzung: