sql >> Database teknologi >  >> RDS >> PostgreSQL

Hvordan bruger man variable indstillinger i triggerfunktioner?

Håndter alle mulige sager for den tilpassede mulighed korrekt:

  1. mulighed ikke indstillet endnu

    Alle henvisninger til det giver anledning til en undtagelse , herunder current_setting() medmindre den kaldes med den anden parameter missing_ok . Manualen:

  2. indstilling indstillet til et gyldigt heltalsliteral

  3. indstilling indstillet til et ugyldigt heltalsliteral

  4. indstillingsnulstilling (som brænder ned til et særligt tilfælde af 3. )

    For eksempel, hvis du indstiller en tilpasset indstilling med SET LOCAL eller set_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 til integer .

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. og 4. opstår kun, fordi tilpassede indstillinger er strenge bogstaver (skriv text ), kan gyldige datatyper ikke håndhæves automatisk.

Relateret:

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:



  1. Sådan ændres MySQL-serverens tidszone

  2. NEWID() vs NEWSEQUENTIALID() i SQL Server:Hvad er forskellen?

  3. SQL til at generere en liste over tal fra 1 til 100

  4. Find fremmednøgleoplysninger ved hjælp af Perl/DBI/MySQL/InnoDB