PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Déclencheur avec nom de champ dynamique

Vous pouvez implémenter cela assez facilement avec le hstore opérateur #= :

Assurez-vous que le module supplémentaire est correctement installé (une fois par base de données), dans un schéma inclus dans votre search_path :

  • Comment utiliser l'opérateur % de l'extension pg_trgm ?
  • Meilleur moyen d'installer hstore sur plusieurs schémas dans une base de données Postgres ?

Fonction déclencheur :

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;

Déclencheur (réutiliser la même fonction pour plusieurs tables) :

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

Étroitement lié avec plus d'explications et de conseils :

  • Affectation d'une colonne avec nom de colonne dynamique
  • Comment accéder au champ NOUVEAU ou ANCIEN étant donné uniquement le nom du champ ?
  • Obtenir des valeurs à partir de différentes colonnes dans un déclencheur générique