Zajmij się wszystkimi możliwymi przypadkami dla opcji niestandardowej prawidłowo:
-
opcja jeszcze nie ustawiona
Wszystkie odniesienia do niego powodują wyjątek , w tym
current_setting()
chyba że zostanie wywołany z drugim parametremmissing_ok
. Podręcznik: -
opcja ustawiona na prawidłowy literał całkowity
-
opcja ustawiona na nieprawidłowy literał całkowity
-
resetowanie opcji (co wypala się w specjalnym przypadku 3. )
Na przykład, jeśli ustawisz niestandardową opcję za pomocą
SET LOCAL
lubset_config('myvars.user_id3', '55', true)
, wartość opcji jest resetowana po zakończeniu transakcji. Nadal istnieje , można się odwoływać, ale teraz zwraca pusty ciąg (''
) - którego nie można rzutować nainteger
.
Pomijając oczywiste błędy w Twoim demo, musisz przygotować się na wszystkie 4 przypadki. A więc:
CREATE OR REPLACE FUNCTION add_transition1()
RETURNS trigger AS
$func$
DECLARE
_user_id text := current_setting('myvars.user_id', true); -- see 1.
BEGIN
IF _user_id ~ '^\d+$' THEN -- one or more digits?
INSERT INTO transitions1 (user_id, house_id)
VALUES (_user_id::int, NEW.id); -- valid int, cast is safe
ELSE
INSERT INTO transitions1 (user_id, house_id)
VALUES (NULL, NEW.id); -- use NULL instead
RAISE WARNING 'Invalid user_id % for house_id % was reset to NULL!'
, quote_literal(_user_id), NEW.id; -- optional
END IF;
RETURN NULL; -- OK for AFTER trigger
END
$func$ LANGUAGE plpgsql;
db<>fiddle tutaj
Uwagi:
-
Unikaj nazw zmiennych, które pasują do nazw kolumn. Bardzo podatny na błędy. Jedną z popularnych konwencji nazewnictwa jest dodawanie do nazw zmiennych podkreślenia:
_user_id
. -
Przypisz w czasie deklaracji, aby zapisać jedno zadanie. Zwróć uwagę na typ danych
text
. Zarzucimy później, po uporządkowaniu nieprawidłowych danych wejściowych. -
Unikaj podnoszenia/łapania wyjątku jeśli to możliwe . Podręcznik:
-
Przetestuj pod kątem prawidłowych ciągów liczb całkowitych. To proste wyrażenie regularne dopuszcza tylko cyfry (bez znaku wiodącego, bez spacji):
_user_id ~ '^\d+$'
. Resetuję do NULL dla każdego nieprawidłowego wejścia. Dostosuj się do swoich potrzeb. -
Dodałem opcjonalne
WARNING
dla wygody debugowania. -
Przypadki
3.
i4.
powstają tylko dlatego, że dostosowane opcje są literałami łańcuchowymi (wpisztext
), prawidłowe typy danych nie mogą być wymuszane automatycznie.
Powiązane:
- Zmienne zdefiniowane przez użytkownika w PostgreSQL
- Czy istnieje sposób na zdefiniowanie nazwanej stałej w zapytaniu PostgreSQL?
Poza tym mogą istnieć bardziej eleganckie rozwiązania dla tego, co próbujesz zrobić, bez niestandardowych opcji, w zależności od dokładnych wymagań. Może to: