Kilka problemów z funkcją wyzwalacza:
-
Użyj
IF EXISTS (...) THEN
zamiast liczenia wszystkich wystąpień. Szybciej, prościej. Zobacz: -
Funkcja wyzwalacza
AFTER
INSERT OR UPDATE
może po prostu zwrócićNULL
.RETURN NEW
dotyczy tylko wyzwalaczy o nazwieBEFORE
. Podręcznik : -
Niezrównoważony pojedynczy cytat.
-
Jak wyjaśnił @Pavel , nie można kontrolować transakcji z poziomu funkcji plpgsql. Każdy nieobsługiwany wyjątek wymusza automatyczne wycofanie całej transakcji. Po prostu usuń
EXCEPTION
blokować.
Twój hipotetyczny wyzwalacz przepisany:
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;
BEFORE
wyzwalacz ma więcej sensu.
Ale a UNIQUE INDEX ON ("Room_Name", "Date")
zrobiłby to samo, bardziej efektywnie. Następnie każdy wiersz z naruszeniem zgłasza wyjątek zduplikowanego klucza i wycofuje transakcję (chyba że zostanie przechwycony i obsłużony). We współczesnym Postgresie możesz alternatywnie pominąć lub przekierować takie INSERT
próby z INSERT ... ON CONFLICT ...
. Zobacz:
Zaawansowane użycie: