Utwórz funkcję wyzwalacza:
create or replace function update_calc_column()
returns trigger
as
$$
begin
new.x3 := new.x1 + new.x2;
return new;
end;
$$
language plpgsql;
Utwórz wyzwalacz:
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
Powyższe jest zasadniczo uproszczoną wersją przykładu z podręcznika
http://www.postgresql.org/docs/current/static/plpgsql-trigger.html#PLPGSQL-TRIGGER-EXAMPLE
Jednak przechowywanie danych pochodnych w taki sposób zwykle nie jest dobrym pomysłem. Powinieneś po prostu utworzyć widok, który zwraca kolumnę X3, która jest zdefiniowana jako X1 + X2
- dużo mniej kodu do utrzymania i równie wydajna (w rzeczywistości to więcej wydajne, ponieważ pozbywasz się nadmiaru wyzwalacza).
Inną (bardziej egzotyczną) opcją jest użycie rozszerzenia obiektowego Postgresa i utworzenie wirtualnej kolumny:
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;
Następnie możesz użyć:
select x.*, x.x3
from x;
SQLFiddle:http://sqlfiddle.com/#!15/53acf/1
Ma to jednak tę wadę, że musisz wyraźnie wybierz x3
kolumna. Nie pojawi się przy użyciu x.*