Anda harus menyegarkan tampilan di pemicu setelah menyisipkan/memperbarui/menghapus/memotong untuk setiap pernyataan di table1
dan table2
.
create or replace function refresh_mat_view()
returns trigger language plpgsql
as $$
begin
refresh materialized view mat_view;
return null;
end $$;
create trigger refresh_mat_view
after insert or update or delete or truncate
on table1 for each statement
execute procedure refresh_mat_view();
create trigger refresh_mat_view
after insert or update or delete or truncate
on table2 for each statement
execute procedure refresh_mat_view();
Dengan cara ini, tampilan terwujud Anda selalu up to date. Solusi sederhana ini mungkin sulit diterima dengan penyisipan/pembaruan yang sering dan pilihan sporadis. Dalam kasus Anda (jarang berubah sekitar dua kali sehari), solusi ini idealnya sesuai dengan kebutuhan Anda.
Untuk mewujudkan penyegaran yang ditangguhkan dari tampilan terwujud Anda memerlukan salah satu fitur berikut:
- pemicu asinkron
- pemicu sebelum memilih
- aturan memilih sebelum
Postgres tidak memilikinya, jadi sepertinya tidak ada jelas solusi postgres.
Mempertimbangkan hal ini, saya akan mempertimbangkan fungsi pembungkus untuk pilihan di mat_view, mis.
CREATE OR REPLACE FUNCTION select_from_mat_view(where_clause text)
RETURNS SETOF mat_view AS $body$
BEGIN
-- here is checking whether to refresh the mat_view
-- then return the select:
RETURN QUERY EXECUTE FORMAT ('SELECT * FROM mat_view %s', where_clause);
END;
$body$ LANGUAGE plpgsql;
Apakah dapat diterima dalam praktiknya tergantung pada hal-hal khusus yang saya tidak tahu.