Ein paar Probleme mit Ihrer Trigger-Funktion:
-
Verwenden Sie
IF EXISTS (...) THENanstatt alle Vorkommen zu zählen. Schneller, einfacher. Siehe: -
Eine Auslösefunktion
AFTERINSERT OR UPDATEkann nurNULLzurückgeben .RETURN NEWist nur relevant für Trigger namensBEFORE. 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
EXCEPTIONblockieren.
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: