[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