38.4. Exemplo de gatilho de evento de reescrita de tabela #

Graças ao evento table_rewrite, é possível implementar uma política de reescrita de tabelas permitindo apenas a reescrita em janelas de manutenção.

A seguir está um exemplo de implementação dessa política.

CREATE OR REPLACE FUNCTION no_rewrite()
 RETURNS event_trigger
 LANGUAGE plpgsql AS
$$
---
--- Implementação de política de reescrita de tabela local:
---   a tabela public.foo não tem permissão para ser reescrita, nunca;
---   para as demais tabelas as reescritas só são permitidas para tabelas
---   com menos de 100 páginas, e só podem ser reescritas entre 1h e 6h
---   da manhã,
---
---
DECLARE
  table_oid oid := pg_event_trigger_table_rewrite_oid();
  current_hour integer := extract('hour' from current_time);
  pages integer;
  max_pages integer := 100;
BEGIN
  IF pg_event_trigger_table_rewrite_oid() = 'public.foo'::regclass
  THEN
        RAISE EXCEPTION 'você não tem permissão para reescrever a tabela %',
                        table_oid::regclass;
  END IF;

  SELECT INTO pages relpages FROM pg_class WHERE oid = table_oid;
  IF pages > max_pages
  THEN
        RAISE EXCEPTION 'as reescritas só são permitidas para tabelas com menos de % páginas',
                        max_pages;
  END IF;

  IF current_hour NOT BETWEEN 1 AND 6
  THEN
        RAISE EXCEPTION 'as reescritas  são permitidas apenas entre 1h e 6h da manhã.';
  END IF;
END;
$$;

CREATE EVENT TRIGGER no_rewrite_allowed
                  ON table_rewrite
   EXECUTE FUNCTION no_rewrite();