Kilka problemów z funkcją wyzwalacza:
-
Użyj
IF EXISTS (...) THENzamiast liczenia wszystkich wystąpień. Szybciej, prościej. Zobacz: -
Funkcja wyzwalacza
AFTERINSERT OR UPDATEmoże po prostu zwrócićNULL.RETURN NEWdotyczy 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ń
EXCEPTIONblokować.
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: