Hantera alla möjliga fall för det anpassade alternativet korrekt:
-
alternativet inte inställt ännu
Alla hänvisningar till den ger upphov till ett undantag , inklusive
current_setting()
såvida det inte anropas med den andra parameternmissing_ok
. Handboken: -
alternativet satt till en giltig heltalsliteral
-
alternativet inställt på en ogiltig heltalsliteral
-
alternativ återställning (som brinner ner till ett specialfall av 3. )
Till exempel, om du ställer in ett anpassat alternativ med
SET LOCAL
ellerset_config('myvars.user_id3', '55', true)
, alternativvärdet återställs i slutet av transaktionen. Den finns fortfarande , kan refereras, men det returnerar en tom sträng nu (''
) - som inte kan castas tillinteger
.
Uppenbara misstag i din demo åt sidan, du måste förbereda dig för alla fyra fallen. 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<>fiol här
Anmärkningar:
-
Undvik variabelnamn som matchar kolumnnamn. Mycket felbenägen. En populär namnkonvention är att införa variabelnamn med ett understreck:
_user_id
. -
Tilldela vid deklarationstillfället för att spara en uppgift. Notera datatypen
text
. Vi castar senare, efter att ha sorterat ut ogiltig inmatning. -
Undvik att höja / fälla ett undantag om möjligt . Handboken:
-
Testa för giltiga heltalssträngar. Detta enkla reguljära uttryck tillåter endast siffror (inga inledande tecken, inget blanksteg):
_user_id ~ '^\d+$'
. Jag återställer till NULL för ogiltig inmatning. Anpassa dig efter dina behov. -
Jag har lagt till en valfri
WARNING
för din felsökningsbekvämlighet. -
Fall
3.
och4.
uppstår bara för att anpassade alternativ är strängliteraler (skrivtext
), giltiga datatyper kan inte tillämpas automatiskt.
Relaterat:
- Användardefinierade variabler i PostgreSQL
- Finns det något sätt att definiera en namngiven konstant i en PostgreSQL-fråga?
Bortsett från detta kan det finnas mer eleganta lösningar för det du försöker göra utan skräddarsydda alternativ, beroende på dina exakta krav. Kanske detta: