Tạo hàm kích hoạt:
create or replace function update_calc_column()
returns trigger
as
$$
begin
new.x3 := new.x1 + new.x2;
return new;
end;
$$
language plpgsql;
Tạo trình kích hoạt:
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
Trên đây thực chất là phiên bản rút gọn của ví dụ trong sổ tay
http://www.postgresql.org/docs/current/static/plpgsql-trigger.html#PLPGSQL-TRIGGER-EXAMPLE
Tuy nhiên, lưu trữ dữ liệu có nguồn gốc như vậy thường không phải là một ý kiến hay. Bạn chỉ cần tạo một dạng xem trả về một cột X3 được định nghĩa là X1 + X2
- ít mã hơn rất nhiều để duy trì và cũng hiệu quả (thực tế là nhiều hơn hiệu quả vì bạn loại bỏ chi phí kích hoạt).
Một tùy chọn khác (kỳ lạ hơn) là sử dụng tiện ích mở rộng hướng đối tượng của Postgres và tạo một cột ảo:
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;
Sau đó, bạn có thể sử dụng:
select x.*, x.x3
from x;
SQLFiddle: http://sqlfiddle.com/#!15/53acf/1
Tuy nhiên, điều này có nhược điểm là bạn cần phải rõ ràng chọn x3
cột. Nó sẽ không hiển thị khi sử dụng x.*