PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Rollback transazione su trigger ERRORE

Un paio di problemi con la tua funzione di attivazione:

  • Usa IF EXISTS (...) THEN invece di contare tutte le occorrenze. Più veloce, più semplice. Vedi:

  • Una funzione di attivazione AFTER INSERT OR UPDATE può semplicemente restituire NULL . RETURN NEW è rilevante solo per i trigger chiamati BEFORE . Il manuale :

  • Virgoletta singola sbilanciata.

  • Come @Pavel ha spiegato , non puoi controllare le transazioni da una funzione plpgsql. Qualsiasi eccezione non gestita forza il rollback automatico dell'intera transazione. Quindi, rimuovi semplicemente EXCEPTION blocco.

Il tuo ipotetico trigger riscritto:

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;

Un BEFORE il grilletto ha più senso.

Ma a UNIQUE INDEX ON ("Room_Name", "Date") farebbe lo stesso, in modo più efficiente. Quindi, qualsiasi riga in violazione genera un'eccezione di chiave duplicata ed esegue il rollback della transazione (a meno che non venga rilevata e gestita). Nel Postgres moderno puoi in alternativa saltare o deviare tale INSERT tentativi con INSERT ... ON CONFLICT ... . Vedi:

Utilizzo avanzato: