[firebase-br] RES: Log de transações

Tecnobyte Informática temp2 em tecnobyte.com.br
Qui Out 25 17:52:02 -03 2012


Não é o caso. Não existe nenhum campo calculado na tabela onde estou 
tentando executar INSERT e UPDATE.

Atenciosamente.

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

-----Mensagem Original----- 
From: Zottis
Sent: Thursday, October 25, 2012 3:30 PM
To: 'FireBase'
Subject: [firebase-br] RES: Log de transações

Vê se você está tentando gravar em campos calculados


-----Mensagem original-----
De: lista [mailto:lista-bounces em firebase.com.br] Em nome de Tecnobyte
Informática
Enviada em: quinta-feira, 25 de outubro de 2012 17:21
Para: lista em firebase.com.br
Assunto: [firebase-br] Log de transações

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