sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur använder man variabelinställningar i triggerfunktioner?

Hantera alla möjliga fall för det anpassade alternativet korrekt:

  1. 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 parametern missing_ok . Handboken:

  2. alternativet satt till en giltig heltalsliteral

  3. alternativet inställt på en ogiltig heltalsliteral

  4. alternativ återställning (som brinner ner till ett specialfall av 3. )

    Till exempel, om du ställer in ett anpassat alternativ med SET LOCAL eller set_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 till integer .

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. och 4. uppstår bara för att anpassade alternativ är strängliteraler (skriv text ), giltiga datatyper kan inte tillämpas automatiskt.

Relaterat:

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:



  1. Hur skapar man ett id (autoincremented) i Mysql med en sträng sammanlänkad med den? använder endast php

  2. Använda Substring i MySQL-kriterier

  3. Cloud Disaster Recovery för MariaDB och MySQL

  4. Konvertera Java byte array till Python byte array