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

Procedimento de disparo do Postgres na inserção usando dados em campos inseridos para inserir dados calculados em outro campo


Crie a função de gatilho:
create or replace function update_calc_column()
  returns trigger
as
$$
begin
  new.x3 := new.x1 + new.x2;
  return new;
end;
$$
language plpgsql;

Crie o acionador:
create trigger calc_trigger 
   before insert or update on X
   for each row
   execute procedure update_calc_column();

SQLFiddle:http://sqlfiddle.com/#!15/7ed21/1

O acima é essencialmente uma versão simplificada do exemplo no manual
http://www.postgresql.org/docs/current/static/plpgsql-trigger.html#PLPGSQL-TRIGGER-EXAMPLE

No entanto, armazenar dados derivados como esse geralmente não é uma boa ideia. Você deve simplesmente criar uma visão que retorne uma coluna X3 que é definida como X1 + X2 - muito menos código para manter e tão eficiente (na verdade, é mais eficiente porque você se livra da sobrecarga do gatilho).

Outra opção (mais exótica) é usar a extensão orientada a objetos do Postgres e criar uma coluna virtual:
create or replace function x3(data X) --<< yes, the type of the parameter is the name of the table 
   returns integer
as
$$
   select data.x1 + data.x2;
$$
language sql;

Você pode então usar:
select x.*, x.x3
from x;

SQLFiddle:http://sqlfiddle.com/#!15/53acf/1

No entanto, isso tem a desvantagem de que você precisa explicitamente selecione o x3 coluna. Ele não aparecerá ao usar x.*