PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Trigger mit dynamischem Feldnamen

Das kannst du ziemlich bequem mit dem hstore umsetzen Operator #= :

Stellen Sie sicher, dass das Zusatzmodul richtig installiert ist (einmal pro Datenbank), in einem Schema, das in Ihrem search_path enthalten ist :

  • Wie verwende ich den %-Operator aus der Erweiterung pg_trgm?
  • Der beste Weg, um hstore auf mehreren Schemas in einer Postgres-Datenbank zu installieren?

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 (die gleiche Funktion für mehrere Tabellen wiederverwenden):

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

Eng verbunden mit weiteren Erklärungen und Ratschlägen:

  • Zuweisung einer Spalte mit dynamischem Spaltennamen
  • Wie greife ich auf NEUE oder ALTE Felder zu, wenn nur der Name des Feldes angegeben ist?
  • Werte aus verschiedenen Spalten in einem generischen Trigger abrufen