Tenho um cenário de teste de dois bancos de dados postgresql conectados via replicação lógica. O BD "A" está publicando inserções e atualizações para a tabela "a1" e o BD "B" está cadastrado e recebendo tudo sem problemas.
Adicionei um gatilho antes da atualização para a tabela "a1" no banco de dados "B". Ele está funcionando para instruções de atualização executadas localmente em "B", mas não é acionado quando a atualização ocorre por meio de replicação lógica. Aqui está a função e o gatilho que estou usando para testá-lo.
CREATE OR REPLACE FUNCTION update_tg_func()
RETURNS TRIGGER AS $$
BEGIN
-- Extract the id value from the update query
-- Assuming that the 'id' column is being updated
RAISE WARNING 'Got OP %, id %', TG_OP, NEW.id;
-- For other operations, just return the NEW row
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER update_tg
BEFORE UPDATE ON a1
FOR EACH STATEMENT
EXECUTE FUNCTION update_tg_func();
ALTER TABLE a1 ENABLE ALWAYS TRIGGER update_tg ;
A versão do Postgres é 12.1, não testada em versões mais recentes.
EDITAR
Graças ao @Melkij notei que meu gatilho não está disparando porque minha mesa está vazia. E minha tabela está vazia porque tenho outro gatilho BEFORE INSERT
que "redireciona" as linhas inseridas para outras tabelas, assim como faria o particionamento, mas sem usar particionamento real.
Achei que o uso FOR EACH STATEMENT
acionaria o gatilho mesmo que nenhuma linha fosse afetada. A documentação diz:
um gatilho marcado é
FOR EACH STATEMENT
executado apenas uma vez para qualquer operação, independentemente de quantas linhas ele modifica https://www.postgresql.org/docs/12/sql-createtrigger.html
Removi a trigger que "redireciona" as linhas inseridas para que minha tabela no DB B tenha algumas linhas e agora a trigger dispara.
Preciso que a trigger seja acionada mesmo que a tabela esteja vazia. Alguma dica?
Pode ser difícil de encontrar, mas está documentado aqui
Embora, olhando para a tentativa de usar
NEW.id
a função de gatilho, acho que você queria criar umFOR EACH ROW
gatilho em vez deFOR EACH STATEMENT
. Tente com o gatilho de linha:PS: é uma péssima ideia ignorar pequenas atualizações por tantos anos. Considere instalar o 12.18