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