Behandel alle mogelijke gevallen voor de aangepaste optie correct:
-
optie nog niet ingesteld
Alle verwijzingen ernaar vormen een uitzondering , inclusief
current_setting()
tenzij aangeroepen met de tweede parametermissing_ok
. De handleiding: -
optie ingesteld op een geldige integer letterlijke
-
optie ingesteld op een ongeldige integer letterlijke
-
optie reset (die opbrandt tot een speciaal geval van 3. )
Als u bijvoorbeeld een aangepaste optie instelt met
SET LOCAL
ofset_config('myvars.user_id3', '55', true)
, wordt de optiewaarde aan het einde van de transactie gereset. Het bestaat nog , kan worden verwezen, maar het retourneert nu een lege tekenreeks (''
) - die niet kan worden gecast naarinteger
.
Afgezien van duidelijke fouten in je demo, moet je je voorbereiden op alle 4 gevallen. Dus:
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 hier
Opmerkingen:
-
Vermijd variabelenamen die overeenkomen met kolomnamen. Zeer foutgevoelig. Een populaire naamgevingsconventie is om namen van variabelen vooraf te laten gaan door een onderstrepingsteken:
_user_id
. -
Toewijzen op aangiftetijdstip om één toewijzing op te slaan. Let op het gegevenstype
text
. We casten later, nadat we ongeldige invoer hebben opgelost. -
Vermijd het verhogen / oversluiten van een uitzondering indien mogelijk . De handleiding:
-
Test op geldige integer-tekenreeksen. Deze eenvoudige reguliere expressie staat alleen cijfers toe (geen voorloopteken, geen witruimte):
_user_id ~ '^\d+$'
. Ik reset naar NULL voor ongeldige invoer. Aanpassen aan uw behoeften. -
Ik heb een optionele
WARNING
. toegevoegd voor uw gemak bij het debuggen. -
Gevallen
3.
en4.
ontstaan alleen omdat aangepaste opties letterlijke tekenreeksen zijn (typetext
), kunnen geldige gegevenstypen niet automatisch worden afgedwongen.
Gerelateerd:
- Door de gebruiker gedefinieerde variabelen in PostgreSQL
- Is er een manier om een benoemde constante in een PostgreSQL-query te definiëren?
Afgezien daarvan kunnen er elegantere oplossingen zijn voor wat u probeert te doen zonder aangepaste opties, afhankelijk van uw exacte vereisten. Misschien dit: