sql >> Databáze >  >> RDS >> PostgreSQL

Jak používat nastavení proměnných ve funkcích spouštění?

Vyřešte všechny možné případy pro přizpůsobenou možnost správně:

  1. 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 parametrem missing_ok . Příručka:

  2. možnost nastavena na platný celočíselný literál

  3. možnost nastavena na neplatný celočíselný literál

  4. 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 nebo set_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 na integer .

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. a 4. vznikají pouze proto, že přizpůsobené možnosti jsou řetězcové literály (typ text ), platné datové typy nelze vynutit automaticky.

Související:

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:



  1. Jak opravit dvojitě zakódované řetězce UTF-8 umístěné v polích MySQL utf8_general_ci?

  2. seznam oddělený čárkami jako výsledek příkazu select v Oracle

  3. Nejlepší nástroje s otevřeným zdrojovým kódem pro migrace MySQL a MariaDB

  4. Jak přerušit vkládání dotazu před vložením spouštěče mysql