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

Trigger med dynamisk feltnavn

Du kan implementere det ret bekvemt med hstore operator #= :

Sørg for, at det ekstra modul er installeret korrekt (én gang per database), i et skema, der er inkluderet i din search_path :

  • Hvordan bruger man % operator fra udvidelsen pg_trgm?
  • Bedste måde at installere hstore på flere skemaer i en Postgres-database?

Udløserfunktion:

CREATE OR REPLACE FUNCTION tbl_insup_bef()
  RETURNS TRIGGER AS
$func$
DECLARE
   _prefix CONSTANT text := 'some prepend data'; -- your prefix here
   _prelen CONSTANT int  := 17;  -- length of above string (optional optimization)
   _col text := quote_ident(TG_ARGV[0]);
   _val text;
BEGIN
   EXECUTE 'SELECT $1.' || _col
   USING NEW
   INTO _val;

   IF left(_val, _prelen) = _prefix THEN 
      -- do nothing: prefix already there!
   ELSE
      NEW := NEW #= hstore(_col, _prefix || _val);  
   END IF;

   RETURN NEW;
END
$func$  LANGUAGE plpgsql;

Trigger (genbrug den samme funktion for flere tabeller):

CREATE TRIGGER insup_bef
BEFORE INSERT OR UPDATE ON tbl
FOR EACH ROW
EXECUTE PROCEDURE tbl_insup_bef('fieldName');  -- unquoted, case-sensitive column name

Nært beslægtet med mere forklaring og råd:

  • Tildeling af en kolonne med dynamisk kolonnenavn
  • Hvordan får man adgang til feltet NYT eller GAMMEL med kun feltets navn?
  • Få værdier fra forskellige kolonner i en generisk trigger


  1. Fuldt administreret PostgreSQL-hosting på AWS og Azure lanceres i tide til ældre migreringer

  2. Brug af PostgreSQL-korrelationsfunktionen

  3. CASE-sætning i WHERE-sætning i SQL Server 2008

  4. Gør postgres datorepræsentation til ISO 8601-streng