U moet de weergave in triggers vernieuwen na insert/update/delete/truncate voor elke instructie op table1
en 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();
Zo is uw gematerialiseerde visie altijd up-to-date. Deze eenvoudige oplossing is misschien moeilijk te accepteren met frequente toevoegingen/updates en sporadische selecties. In uw geval (wisselt zelden ongeveer twee keer per dag) past het perfect bij uw behoeften.
Om uitgestelde vernieuwing te realiseren van een gematerialiseerde weergave heeft u een van de volgende functies nodig:
- asynchrone trigger
- triggeren voor selecteren
- regel op selecteren vóór
Postgres heeft er geen, dus het lijkt erop dat er geen duidelijke . is postgres-oplossing.
Hiermee rekening houdend, zou ik een wrapper-functie overwegen voor selecties op mat_view, bijvoorbeeld
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;
Of het in de praktijk acceptabel is, hangt af van details die ik niet weet.