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 nurNULL
zurückgeben .RETURN NEW
ist 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
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: