PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak używać zmiennych ustawień w funkcjach wyzwalaczy?

Zajmij się wszystkimi możliwymi przypadkami dla opcji niestandardowej prawidłowo:

  1. opcja jeszcze nie ustawiona

    Wszystkie odniesienia do niego powodują wyjątek , w tym current_setting() chyba że zostanie wywołany z drugim parametrem missing_ok . Podręcznik:

  2. opcja ustawiona na prawidłowy literał całkowity

  3. opcja ustawiona na nieprawidłowy literał całkowity

  4. resetowanie opcji (co wypala się w specjalnym przypadku 3. )

    Na przykład, jeśli ustawisz niestandardową opcję za pomocą SET LOCAL lub set_config('myvars.user_id3', '55', true) , wartość opcji jest resetowana po zakończeniu transakcji. Nadal istnieje , można się odwoływać, ale teraz zwraca pusty ciąg ('' ) - którego nie można rzutować na integer .

Pomijając oczywiste błędy w Twoim demo, musisz przygotować się na wszystkie 4 przypadki. A więc:

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 tutaj

Uwagi:

  • Unikaj nazw zmiennych, które pasują do nazw kolumn. Bardzo podatny na błędy. Jedną z popularnych konwencji nazewnictwa jest dodawanie do nazw zmiennych podkreślenia:_user_id .

  • Przypisz w czasie deklaracji, aby zapisać jedno zadanie. Zwróć uwagę na typ danych text . Zarzucimy później, po uporządkowaniu nieprawidłowych danych wejściowych.

  • Unikaj podnoszenia/łapania wyjątku jeśli to możliwe . Podręcznik:

  • Przetestuj pod kątem prawidłowych ciągów liczb całkowitych. To proste wyrażenie regularne dopuszcza tylko cyfry (bez znaku wiodącego, bez spacji):_user_id ~ '^\d+$' . Resetuję do NULL dla każdego nieprawidłowego wejścia. Dostosuj się do swoich potrzeb.

  • Dodałem opcjonalne WARNING dla wygody debugowania.

  • Przypadki 3. i 4. powstają tylko dlatego, że dostosowane opcje są literałami łańcuchowymi (wpisz text ), prawidłowe typy danych nie mogą być wymuszane automatycznie.

Powiązane:

Poza tym mogą istnieć bardziej eleganckie rozwiązania dla tego, co próbujesz zrobić, bez niestandardowych opcji, w zależności od dokładnych wymagań. Może to:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak tworzyć trwałe pliki w Heroku?

  2. Mapowanie tablicy za pomocą Hibernate

  3. Sprawdzanie składni PostgreSQL bez uruchamiania zapytania

  4. Zapytanie PostgreSQL ILIKE z SQLAlchemy

  5. Nie można połączyć się z serwerem Postgres w dockerze z zadokowanej aplikacji