PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Acionador com nome de campo dinâmico


Você pode implementar isso convenientemente com o hstore operador #= :

Certifique-se de que o módulo adicional esteja instalado corretamente (uma vez por banco de dados), em um esquema incluído em seu search_path :
  • Como usar o operador % da extensão pg_trgm?
  • Melhor maneira de instalar o hstore em vários esquemas em um banco de dados Postgres?

Função de gatilho:
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 (reutilize a mesma função para várias tabelas):
CREATE TRIGGER insup_bef
BEFORE INSERT OR UPDATE ON tbl
FOR EACH ROW
EXECUTE PROCEDURE tbl_insup_bef('fieldName');  -- unquoted, case-sensitive column name

Intimamente relacionado com mais explicações e conselhos:
  • Atribuição de uma coluna com nome de coluna dinâmico
  • Como acessar o campo NOVO ou ANTIGO com apenas o nome do campo?
  • Receba valores de colunas variadas em um acionador genérico