Estou usando o particionamento baseado em tempo "clássico" usando gatilhos. Encontrei a necessidade de um gatilho separado, que é executado na tabela original.
CREATE TABLE twitter_interactions(...);
CREATE OR REPLACE FUNCTION insert_twitter_interactions ...;
CREATE TRIGGER insert_twitter_interactions_trig
BEFORE INSERT OR UPDATE on twitter_interactions
FOR EACH ROW EXECUTE PROCEDURE insert_twitter_interactions();
CREATE OR REPLACE FUNCTION maintain_data_pointers ...;
CREATE TRIGGER maintain_data_pointers_trig
BEFORE INSERT OR UPDATE on twitter_interactions
FOR EACH ROW EXECUTE PROCEDURE insert_twitter_interactions();
Não verifiquei totalmente, mas suspeito que a lógica de particionamento seja executada antes do gatilho de manutenção e, como a linha não termina na tabela pai, o segundo gatilho nunca é acionado.
O que acontece se eu quiser executar um AFTER INSERT OR UPDATE
também? Como a linha não entra na tabela original, não consigo implementar a lógica posterior.
O PostgreSQL executa os gatilhos em ordem alfabética por nome. Portanto, certifique-se de usar nomes que os coloquem na ordem desejada. Dos documentos
BTW seu SQL cria o mesmo gatilho duas vezes.
Eu não poderia dizer melhor do que o manual aqui :
Nem os acionadores posteriores (em ordem alfabética) no mesmo evento nem quaisquer
AFTER
acionadores serão acionados, se oBEFORE
acionador for cancelado.