ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

[Resolvido] Replicação de bases - Firebird

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Banco de Dados
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
hjmarcon
Aprendiz
Aprendiz


Registrado: Segunda-Feira, 16 de Julho de 2007
Mensagens: 112

MensagemEnviada: Seg Set 11, 2017 4:56 pm    Assunto: [Resolvido] Replicação de bases - Firebird Responder com Citação

Olá.
Estou fazendo uma rotina de replicação de dados seguindo a seguinte estrutura de triggers
Código:
SET TERM ^ ;
CREATE TRIGGER REPL_TABELA FOR TABELA ACTIVE
AFTER INSERT OR UPDATE OR DELETE POSITION 0
AS
begin
in autonomous transaction do
begin
if (inserting) then
insert into REPLICACAO values(
CURRENT_DATE, (SELECT COALESCE(MAX(SEQ_REP)+1,1) FROM REPLICACAO WHERE DTA_REP = CURRENT_DATE)
,'TABELA'
,'INSERT INTO TABELA VALUES('||NEW.CAMPO1_INT
||','||NEW.CAMPO2_STRING
||','||NEW.CAMPO3_DATETIME
||','||NEW.CAMPO4_DECIMAL
||')'
,'I', 'N', CURRENT_TIMESTAMP);
if (updating) then
insert into REPLICACAO values(
CURRENT_DATE, (SELECT COALESCE(MAX(SEQ_REP)+1,1) FROM REPLICACAO WHERE DTA_REP = CURRENT_DATE)
,'TABELA'
,'UPDATE TABELA SET '||
' CAMPO2_STRING = '||NEW.CAMPO2_STRING||
',CAMPO3_DATETIME = '||NEW.CAMPO3_DATETIME||
',CAMPO4_DECIMAL = '||NEW.CAMPO4_DECIMAL||
' WHERE CAMPO1_INT = '||NEW.CAMPO1_INT||
, 'U', 'N', CURRENT_TIMESTAMP);
if (deleting) then
insert into REPLICACAO values(
CURRENT_DATE, (SELECT COALESCE(MAX(SEQ_REP)+1,1) FROM REPLICACAO WHERE DTA_REP = CURRENT_DATE)
,'TABELA'
,'DELETE FROM TABELA'||
' WHERE CAMPO1_INT = '||OLD.CAMPO1_INT||
, 'D', 'N', CURRENT_TIMESTAMP);
end
end
^
SET TERM ;


Criei um programa que gera automaticamente as triggers de todas as tabelas.
As triggers estão funcionando perfeitamente, porém surgiu um problema que, se não contornar, vai ficar inviável de usar essa forma de replicação:
O que fazer quando há rollback?
As triggers são ativadas assim que o comando é executado. Independente de commit, o comando fica gravado na tabela REPLICACAO.
Existe alguma forma de não gravar na tabela de REPLICACAO se houver rollback na instrução original?

Grato.


Editado pela última vez por hjmarcon em Qua Set 13, 2017 11:03 am, num total de 1 vez
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
hjmarcon
Aprendiz
Aprendiz


Registrado: Segunda-Feira, 16 de Julho de 2007
Mensagens: 112

MensagemEnviada: Qua Set 13, 2017 11:01 am    Assunto: Responder com Citação

Creio que consegui identificar o problema:
"in autonomous transaction do ". Pelo que dá a entender, será utilizada uma transação só para a trigger, ignorando a transação em que está sendo feito o comando.
Pelos testes que fiz, resolveu o problema. Segue a instrução da trigger alterada:
SET TERM ^ ;
CREATE TRIGGER REPL_TABELA FOR TABELA ACTIVE
AFTER INSERT OR UPDATE OR DELETE POSITION 0
AS
begin
--in autonomous transaction do
--begin
if (inserting) then
insert into REPLICACAO values(
CURRENT_DATE, (SELECT COALESCE(MAX(SEQ_REP)+1,1) FROM REPLICACAO WHERE DTA_REP = CURRENT_DATE)
,'TABELA'
,'INSERT INTO TABELA VALUES('||NEW.CAMPO1_INT
||','||NEW.CAMPO2_STRING
||','||NEW.CAMPO3_DATETIME
||','||NEW.CAMPO4_DECIMAL
||')'
,'I', 'N', CURRENT_TIMESTAMP);
if (updating) then
insert into REPLICACAO values(
CURRENT_DATE, (SELECT COALESCE(MAX(SEQ_REP)+1,1) FROM REPLICACAO WHERE DTA_REP = CURRENT_DATE)
,'TABELA'
,'UPDATE TABELA SET '||
' CAMPO2_STRING = '||NEW.CAMPO2_STRING||
',CAMPO3_DATETIME = '||NEW.CAMPO3_DATETIME||
',CAMPO4_DECIMAL = '||NEW.CAMPO4_DECIMAL||
' WHERE CAMPO1_INT = '||NEW.CAMPO1_INT||
, 'U', 'N', CURRENT_TIMESTAMP);
if (deleting) then
insert into REPLICACAO values(
CURRENT_DATE, (SELECT COALESCE(MAX(SEQ_REP)+1,1) FROM REPLICACAO WHERE DTA_REP = CURRENT_DATE)
,'TABELA'
,'DELETE FROM TABELA'||
' WHERE CAMPO1_INT = '||OLD.CAMPO1_INT||
, 'D', 'N', CURRENT_TIMESTAMP);
--end
end
^
SET TERM ;
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Banco de Dados Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB