[firebase-br] Log de transações

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


Olá Gladiston

A ideia de usar um banco de dados externo também me passou pela cabeça, mas 
primeiro vou tentar gravar no mesmo banco.

Os gatilhos (triggers) não estão associados a nenhuma tabela. Na verdade 
estou usando database trigger para os eventos TRANSACTION START e 
TRANSACTION COMMIT. Estes gatilhos são disparados no momento em que inicia 
(start) e confirma (commit) uma transação.

Em relação ao problema das tabelas "virtuais" do sistema, estou usando-as 
apenas para pegar os dados (SELECT apenas).

A tabela que está recebendo INSERT é uma tabela normal, que eu mesmo criei. 
Apenas deixei o nome MON_TRANSACTIONS para ficar semelhante à tabela de 
monitoramento MON$TRANSACTIONS.

MON$TRANSACTIONS é a tabela de sistema que contém os dados das transações em 
andamento.
MON_TRANSACTIONS é uma tabela que criei para gravar os dados de todas as 
transações iniciadas e confirmadas.

Atenciosamente.

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

-----Mensagem Original----- 
From: Gladiston Santana
Sent: Thursday, October 25, 2012 4:11 PM
To: FireBase
Subject: Re: [firebase-br] Log de transações

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