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