[firebase-br] Log de transações
Gladiston Santana
gladiston em vidy.com.br
Qui Out 25 18:11:44 -03 2012
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>
>
Mais detalhes sobre a lista de discussão lista