Etapa de coleta da transação
Inicialmente, utilizamos um trigger bastante simples e genérico, denominado trigger coletor, que é utilizado para todos os tipos de refatorações existentes, com o objetivo de capturar todas as informações da transação, i.e., qual foi a operação (inserção, exclusão ou atualização), quais os valores anteriores existentes na tabela e quais os novos valores usados para a atualização.
No diagrama acima, Informações das transações representa as tabelas criadas para armazenar os dados coletados pelos triggers. No caso da tabela Paciente é criada a tabela temporária pacientes_transactions, cuja estrutura é definida a partir da tabela Paciente, contendo as seguintes colunas:
- Colunas id e id_table: a coluna id é apenas um sequencial da tabela pacientes_transactions e a coluna id_table é o sequencial da tabela de pacientes.
- Coluna status: para todas as linhas incluídas na tabela pacientes_transactions, essa coluna recebe o valor de NEW. Após o processo de sincronização realizar o seu trabalho com sucesso, as linhas processadas recebem o valor EXECUTED e não são mais utilizadas nas próximas execuções do processo de sincronização.
- Coluna operation: contém a operação realizada na tabela de pacientes. Os valores possíveis são: DELETE, UPDATE e INSERT. Esta informação indicará para o processo de sincronização o que deve ser feito na tabela de destino.
- Colunas com nomes NEW + Nome da coluna: armazenam, para as transações de inclusão e atualização, os novos valores das colunas.
- Colunas com nomes OLD + Nome da coluna: essas colunas, para as transações de exclusão e atualização, armazenam os valores antigos das colunas.
Para o exemplo do diagrama acima, temos o seguinte código do trigger coletor para a tabela Paciente
CREATE OR REPLACE FUNCTION f_pacientes_transactions() RETURNS TRIGGER AS $f_pacientes_transactions$
DECLARE
BEGIN
IF (TG_OP = 'DELETE') THEN
INSERT INTO pacientes_transactions
(status,operation,id_table,OLD_nome,OLD_profissao,OLD_salario,OLD_pagaAluguel)
VALUES
('NEW','DELETE', OLD.id,OLD.nome,OLD.profissao,OLD.salario,OLD.pagaAluguel);
ELSIF (TG_OP = 'UPDATE') THEN
INSERT INTO pacientes_transactions
(status,operation,id_table,NEW_nome,NEW_profissao,NEW_salario,NEW_pagaAluguel,OLD_nome,OLD_profissao,OLD_salario,OLD_pagaAluguel)
VALUES
('NEW','UPDATE', NEW.id,NEW.nome,NEW.profissao,NEW.salario,NEW.pagaAluguel,OLD.nome,OLD.profissao,OLD.salario,OLD.pagaAluguel);
ELSIF (TG_OP = 'INSERT') THEN
INSERT INTO pacientes_transactions
(status,operation,id_table,NEW_nome,NEW_profissao,NEW_salario,NEW_pagaAluguel)
VALUES
('NEW','INSERT', NEW.id,NEW.nome,NEW.profissao,NEW.salario,NEW.pagaAluguel);
END IF;
RETURN NULL;
END;
$f_pacientes_transactions$ LANGUAGE plpgsql;
CREATE TRIGGER t_pacientes_transactions
AFTER INSERT OR UPDATE OR DELETE ON pacientes
FOR EACH ROW EXECUTE PROCEDURE f_pacientes_transactions();