sql >> Database >  >> RDS >> PostgreSQL

Vernieuw een gerealiseerde weergave automatisch met behulp van een regel of melding

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.



  1. wat gebeurt er in de adoptiefase, voorbereiding

  2. MySQL-opgeslagen procedure versus functie, welke zou ik wanneer gebruiken?

  3. CSV-bestand importeren in SQL Server

  4. PDO vs pg_* functies