Créez la fonction de déclenchement :
create or replace function update_calc_column()
returns trigger
as
$$
begin
new.x3 := new.x1 + new.x2;
return new;
end;
$$
language plpgsql;
Créez le déclencheur :
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
Ce qui précède est essentiellement une version simplifiée de l'exemple du manuel
http://www.postgresql.org/docs/current/static/plpgsql-trigger.html#PLPGSQL-TRIGGER-EXAMPLE
Cependant, stocker des données dérivées de cette manière n'est généralement pas une bonne idée. Vous devez simplement créer une vue qui renvoie une colonne X3 qui est définie comme X1 + X2
- beaucoup moins de code à maintenir et tout aussi efficace (en fait c'est plus efficace car vous vous débarrassez de la surcharge du déclencheur).
Une autre option (plus exotique) consiste à utiliser l'extension orientée objet de Postgres et à créer une colonne virtuelle :
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;
Vous pouvez ensuite utiliser :
select x.*, x.x3
from x;
SQLFiddle :http://sqlfiddle.com/#!15/53acf/1
Cela a cependant l'inconvénient que vous devez explicitement sélectionnez le x3
colonne. Il n'apparaîtra pas lors de l'utilisation de x.*