 |
ActiveDelphi .: O site do programador Delphi! :.
|
Exibir mensagem anterior :: Exibir próxima mensagem |
Autor |
Mensagem |
hjmarcon Aprendiz

Registrado: Segunda-Feira, 16 de Julho de 2007 Mensagens: 112
|
Enviada: Seg Set 11, 2017 4:56 pm Assunto: [Resolvido] Replicação de bases - Firebird |
|
|
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 |
|
 |
hjmarcon Aprendiz

Registrado: Segunda-Feira, 16 de Julho de 2007 Mensagens: 112
|
Enviada: Qua Set 13, 2017 11:01 am Assunto: |
|
|
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 |
|
 |
|
|
Enviar Mensagens Novas: Proibido. Responder Tópicos Proibido Editar Mensagens: Proibido. Excluir Mensagens: Proibido. Votar em Enquetes: Proibido.
|
|