sql >> Databasteknik >  >> RDS >> PostgreSQL

Trigger med dynamiskt fältnamn

Du kan implementera det ganska bekvämt med hstore operator #= :

Se till att tilläggsmodulen är korrekt installerad (en gång per databas), i ett schema som ingår i din search_path :

  • Hur använder man % operator från tillägget pg_trgm?
  • Bästa sättet att installera hstore på flera scheman i en Postgres-databas?

Triggerfunktion:

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 (återanvänd samma funktion för flera 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ärbesläktad med mer förklaring och råd:

  • Tilldelning av en kolumn med dynamiskt kolumnnamn
  • Hur får man tillgång till NYA eller GAMLA fält med endast fältets namn?
  • Hämta värden från olika kolumner i en generisk utlösare


  1. AMD EPYC-processorer i virtuella Azure-maskiner

  2. Hur kan jag infoga många rader i en MySQL-tabell och returnera de nya ID:n?

  3. Vilka är omkostnaderna för att använda AUTOINCREMENT för SQLite på Android?

  4. Lär känna funktionerna och funktionerna i MariaDB SkySQL