Vyřešte všechny možné případy pro přizpůsobenou možnost správně:
-
možnost ještě není nastavena
Všechny odkazy na něj vyvolávají výjimku , včetně
current_setting()
pokud není voláno s druhým parametremmissing_ok
. Příručka: -
možnost nastavena na platný celočíselný literál
-
možnost nastavena na neplatný celočíselný literál
-
možnost reset (která se spálí na speciální případ 3. )
Pokud například nastavíte přizpůsobenou možnost pomocí
SET LOCAL
neboset_config('myvars.user_id3', '55', true)
, hodnota opce se na konci transakce vynuluje. Stále existuje , lze odkazovat, ale nyní vrací prázdný řetězec (''
) – které nelze přetypovat nainteger
.
Pomineme-li zjevné chyby ve vašem demu, musíte se připravit na všechny 4 případy. Takže:
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 zde
Poznámky:
-
Vyhněte se názvům proměnných, které odpovídají názvům sloupců. Velmi náchylné k chybám. Jednou z oblíbených konvencí pojmenování je přidat před názvy proměnných podtržítko:
_user_id
. -
Přiřadit v době deklarace pro uložení jednoho přiřazení. Všimněte si datového typu
text
. Odesíláme později, až vyřešíme neplatný vstup. -
Vyhněte se vyvolání/zachycení výjimky je-li to možné . Příručka:
-
Test na platné celočíselné řetězce. Tento jednoduchý regulární výraz povoluje pouze číslice (bez znaku na začátku, bez mezer):
_user_id ~ '^\d+$'
. Pro jakýkoli neplatný vstup jsem resetoval na NULL. Přizpůsobte se svým potřebám. -
Přidal jsem nepovinné
WARNING
pro vaše pohodlí při ladění. -
Případy
3.
a4.
vznikají pouze proto, že přizpůsobené možnosti jsou řetězcové literály (typtext
), platné datové typy nelze vynutit automaticky.
Související:
- Uživatelsky definované proměnné v PostgreSQL
- Existuje způsob, jak definovat pojmenovanou konstantu v dotazu PostgreSQL?
Kromě toho mohou existovat elegantnější řešení pro to, co se snažíte dělat bez přizpůsobených možností, v závislosti na vašich přesných požadavcích. Možná toto: