[firebase-br] Log de transações

Tecnobyte Informática temp2 em tecnobyte.com.br
Qui Out 25 18:53:09 -03 2012


Na documentação do Firebird tem isto:

TRANSACTION triggers are executed within the transaction whose opening, 
committing or rolling-back evokes them.

Traduzindo, triggers para os eventos de transações são executados dentro da 
mesma transação que disparou o evento. Se isto que está na documentação for 
verdade, então não será iniciada uma nova transação.

De qualquer modo, a sua observação é muito importante!

Atenciosamente.

Daniel P. Guimarães
Tecnobyte Informática
www.tecnobyte.com.br

-----Mensagem Original----- 
From: Alysson Gonçalves de Azevedo
Sent: Thursday, October 25, 2012 4:16 PM
To: FireBase
Subject: Re: [firebase-br] Log de transações

Eu já ia perguntar isso...
Quando você vai atualizar a tabela de log quando uma transação começa, isso
não gera outra transação? Nessa segunda transação não seria executado a
trigger de novo?
Não sei pra esses caso no firebird, mas em linguagens de programação comuns
isso causaria loop infinito.


Alysson Gonçalves de Azevedo - (11) 984 917 730

"É curioso como as pessoas ficam confusas quando a frase não terminam do
jeito que elas periquito."



Em 25 de outubro de 2012 18:11, Gladiston Santana
<gladiston em vidy.com.br>escreveu:

> Embora a mensagem de erro indique que o problema é atualizar algo numa
> transação que é readonly, eu acho que o problema é outro.
>
> Posso estar enganado Daniel, por isso talvez a informação que irei lhe
> passar talvez careça de confirmação, mas as tabelas de sistemas, muitas
> delas possuem triggers também, por isso nem sempre é possível montar suas
> triggers em cima de alguns objetos pois podem causar o efeito chamado
> "nearest triggers" que pode ser comparado a uma queda de dominós que nunca
> terminam, por essa razão, ao ser detectado tal efeito, o sistema se 
> protege
> cancelando a operação. Além disso, certas tabelas de sistemas
> como MON$TRANSACTIONS não estão materializadas dentro do banco, isto é,
> você faz select nela, mas os dados não estão nela, é apenas uma forma do
> banco de dados dar transparência a algumas informações que de outra forma
> só estariam acessíveis via API.
>
>
> Achei muito interessante sua idéia de usar a tabela MON$TRANSACTIONS para
> constituir um log de operações, ela é muito criativa, mas talvez você deva
> incluir um execute statement external chamando uma SP noutro .fdb que
> guardará as informações de log que você capturou. Talvez isso previna o
> erro que tá ocorrendo, eu disse talvez por causa do que eu disse a 
> respeito
> da MON$TRANSACTIONS. Mas se funcionar, seria uma mão na roda.
>
> Se você conseguir, não esqueça dos amigos :)
>
> []´s e sucesso.
>
> 2012/10/25 Tecnobyte Informática <temp2 em tecnobyte.com.br>
>
> > Boa tarde
> >
> > Estou precisando fazer um log de todas as transações executadas no banco
> > de dados (Firebird 2.5.1). O código abaixo executa normalmente, mas em
> > seguida, quando vou iniciar uma nova transação, ocorre este erro:
> >
> > attempted update during read-only transaction
> > At trigger 'TG_TRANSACTION_START' line: 3, col: 3
> >
> > Tentei usar transação autônoma para gravar o log, mas também não deu
> certo.
> >
> > Alguém sabe como resolver este problema?
> > --
> >
> > CREATE TABLE MON_TRANSACTIONS
> > (
> >  ID                     INTEGER,
> >  MON_TRANSACTION_ID       INTEGER,
> >  MON_ATTACHMENT_ID         INTEGER,
> >  MON_STATE                 INTEGER,
> >  MON_START_TIMESTAMP    TIMESTAMP,
> >  MON_COMMIT_TIMESTAMP   TIMESTAMP,
> >  MON_TOP_TRANSACTION       INTEGER,
> >  MON_OLDEST_TRANSACTION INTEGER,
> >  MON_OLDEST_ACTIVE         INTEGER,
> >  MON_ISOLATION_MODE       SMALLINT,
> >  MON_LOCK_TIMEOUT         SMALLINT,
> >  MON_READ_ONLY             SMALLINT,
> >  MON_AUTO_COMMIT           SMALLINT,
> >  MON_AUTO_UNDO             SMALLINT,
> >  CONSTRAINT PK_MON_TRANSACTIONS PRIMARY KEY(ID)
> > );
> >
> > CREATE SEQUENCE SQ_MON_TRANSACTIONS_ID;
> >
> > SET TERM ^ ;
> >
> > CREATE OR ALTER TRIGGER TG_TRANSACTION_START ON TRANSACTION START AS
> > BEGIN
> >  INSERT INTO MON_TRANSACTIONS(
> >    ID,
> >    MON_TRANSACTION_ID,
> >    MON_ATTACHMENT_ID,
> >    MON_STATE,
> >    MON_START_TIMESTAMP,
> >    MON_TOP_TRANSACTION,
> >    MON_OLDEST_TRANSACTION,
> >    MON_OLDEST_ACTIVE,
> >    MON_ISOLATION_MODE,
> >    MON_LOCK_TIMEOUT,
> >    MON_READ_ONLY,
> >    MON_AUTO_COMMIT,
> >    MON_AUTO_UNDO)
> >  SELECT
> >    NEXT VALUE FOR SQ_MON_TRANSACTIONS_ID,
> >    MON$TRANSACTION_ID,
> >    MON$ATTACHMENT_ID,
> >    MON$STATE,
> >    CURRENT_TIMESTAMP,
> >    MON$TOP_TRANSACTION,
> >    MON$OLDEST_TRANSACTION,
> >    MON$OLDEST_ACTIVE,
> >    MON$ISOLATION_MODE,
> >    MON$LOCK_TIMEOUT,
> >    MON$READ_ONLY,
> >    MON$AUTO_COMMIT,
> >    MON$AUTO_UNDO
> >  FROM MON$TRANSACTIONS
> >  WHERE MON$TRANSACTION_ID = CURRENT_TRANSACTION;
> > END^
> >
> > CREATE OR ALTER TRIGGER TG_TRANSACTION_COMMIT ON TRANSACTION COMMIT AS
> > BEGIN
> >  UPDATE MON_TRANSACTIONS SET
> >    MON_COMMIT_TIMESTAMP = CURRENT_TIMESTAMP
> >  WHERE MON_TRANSACTION_ID = CURRENT_TRANSACTION;
> > END^
> >
> >
> > Atenciosamente.
> >
> > Daniel P. Guimarães
> > Tecnobyte Informática
> > www.tecnobyte.com.br
> > 





Mais detalhes sobre a lista de discussão lista