Puede implementar eso de manera bastante conveniente con hstore
operador #=
:
Asegúrese de que el módulo adicional esté instalado correctamente (una vez por base de datos), en un esquema que se incluye en su search_path
:
- ¿Cómo usar el operador % de la extensión pg_trgm?
- ¿La mejor manera de instalar hstore en varios esquemas en una base de datos de Postgres?
Función de disparo:
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;
Activar (reutilizar la misma función para varias tablas):
CREATE TRIGGER insup_bef
BEFORE INSERT OR UPDATE ON tbl
FOR EACH ROW
EXECUTE PROCEDURE tbl_insup_bef('fieldName'); -- unquoted, case-sensitive column name
Muy relacionado con más explicaciones y consejos:
- Asignación de una columna con nombre de columna dinámico
- ¿Cómo acceder al campo NUEVO o ANTIGUO dado solo el nombre del campo?
- Obtenga valores de diferentes columnas en un disparador genérico