sql >> Base de Datos >  >> RDS >> PostgreSQL

Desencadenador con nombre de campo dinámico

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