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();