[firebase-br] Log de transações

Alysson Gonçalves de Azevedo agalysson em gmail.com
Qui Out 25 18:16:01 -03 2012


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
> >
> >
> > ______________________________**________________
> > FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> > Para saber como gerenciar/excluir seu cadastro na lista, use:
> > http://www.firebase.com.br/fb/**artigo.php?id=1107<
> http://www.firebase.com.br/fb/artigo.php?id=1107>
> > Para consultar mensagens antigas: http://firebase.com.br/**pesquisa<
> http://firebase.com.br/pesquisa>
> >
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> Para saber como gerenciar/excluir seu cadastro na lista, use:
> http://www.firebase.com.br/fb/artigo.php?id=1107
> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>



Mais detalhes sobre a lista de discussão lista