Håndter alle mulige sager for den tilpassede mulighed korrekt:
-
mulighed ikke indstillet endnu
Alle henvisninger til det giver anledning til en undtagelse , herunder
current_setting()
medmindre den kaldes med den anden parametermissing_ok
. Manualen: -
indstilling indstillet til et gyldigt heltalsliteral
-
indstilling indstillet til et ugyldigt heltalsliteral
-
indstillingsnulstilling (som brænder ned til et særligt tilfælde af 3. )
For eksempel, hvis du indstiller en tilpasset indstilling med
SET LOCAL
ellerset_config('myvars.user_id3', '55', true)
, nulstilles optionsværdien ved slutningen af transaktionen. Den findes stadig , kan refereres til, men det returnerer en tom streng nu (''
) - som ikke kan castes tilinteger
.
Bortset fra åbenlyse fejl i din demo, du skal forberede dig på alle 4 sager. Så:
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 her
Bemærkninger:
-
Undgå variabelnavne, der matcher kolonnenavne. Meget fejltilbøjelig. En populær navnekonvention er at foranstille variabelnavne med en understregning:
_user_id
. -
Tildel på erklæringstidspunktet for at gemme én opgave. Bemærk datatypen
text
. Vi caster senere, efter at vi har sorteret ugyldigt input. -
Undgå at hæve/indfange en undtagelse hvis det er muligt . Manualen:
-
Test for gyldige heltalsstrenge. Dette simple regulære udtryk tillader kun cifre (ingen indledende tegn, intet mellemrum):
_user_id ~ '^\d+$'
. Jeg nulstiller til NULL for enhver ugyldig input. Tilpas til dine behov. -
Jeg tilføjede en valgfri
WARNING
for din fejlfinding. -
Sager
3.
og4.
opstår kun, fordi tilpassede indstillinger er strenge bogstaver (skrivtext
), kan gyldige datatyper ikke håndhæves automatisk.
Relateret:
- Brugerdefinerede variabler i PostgreSQL
- Er der en måde at definere en navngivet konstant i en PostgreSQL-forespørgsel?
Alt dette til side kan der være mere elegante løsninger til det, du forsøger at gøre uden tilpassede muligheder, afhængigt af dine præcise krav. Måske dette: