sql >> Database >  >> RDS >> PostgreSQL

Trigger met dynamische veldnaam

Je kunt dat vrij gemakkelijk implementeren met de hstore operator #= :

Zorg ervoor dat de extra module correct is geïnstalleerd (eenmaal per database), in een schema dat is opgenomen in uw search_path :

  • Hoe gebruik je de %-operator van de extensie pg_trgm?
  • De beste manier om hstore op meerdere schema's in een Postgres-database te installeren?

Trigger-functie:

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 (hergebruik dezelfde functie voor meerdere tabellen):

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

Nauw verwant met meer uitleg en advies:

  • Toewijzing van een kolom met dynamische kolomnaam
  • Hoe krijg ik toegang tot het NIEUW of OUD veld met alleen de naam van het veld?
  • Krijg waarden uit verschillende kolommen in een generieke trigger


  1. MySQL &MariaDB Query Caching met ProxySQL &ClusterControl

  2. COUNT(*) selecteren met DISTINCT

  3. Hoe krijg ik min, mediaan en max van mijn query in postgresql?

  4. Doe met ons mee voor een introductie tot toegang met SQL Server