Talvez seja uma pergunta estúpida, mas não encontrei uma resposta explícita...
Eu quero pegar qualquer atualização no meu oracle db, então eu quero usar gatilhos, mas os gatilhos não foram ativados ao usar SELECT FOR UPDATE
, then lob.write(...)
e COMMIT
. (Eu testei com c++ usando occi)
Existe alguma maneira de pegá-lo em um gatilho de atualização (ou qualquer outro)?
Acho difícil acreditar que existe comando que não pode ser monitorado por nenhuma trigger...
Se for importante, estou usando a versão 11g.
Obrigado!
EDITAR
Gatilho por exemplo:
CREATE OR REPLACE TRIGGER TR1
BEFORE DELETE OR INSERT OR UPDATE ON TEST_CLOB
FOR EACH ROW
BEGIN
IF DELETING THEN
WRITE_LOG('LOG_DIR','deleting:'||:old.filename);
goto endproc;
END IF;
IF INSERTING THEN
WRITE_LOG('LOG_DIR','inserting:'||:new.filename);
goto endproc;
END IF;
IF UPDATING THEN
WRITE_LOG('LOG_DIR','updating:'||:old.filename||'-'||:new.filename);
goto endproc;
END IF;
WRITE_LOG('LOG_DIR','other:'||:old.filename||'-'||:new.filename);
<<endproc>>
NULL;
END;
Agora, no meu log, vejo a inserção e a exclusão, mas nunca vejo nenhuma atualização.
Comentário copiado:
Você não pode fazer isso, pelo menos até 12c: "Usar funções OCI ou o pacote DBMS_LOB para atualizar valores LOB ou atributos LOB de colunas de objeto não dispara gatilhos definidos na tabela que contém as colunas ou atributos." (docs.oracle.com/database/121/ADDCI/lobs.htm#ADDCI4383 )
Um SELECT FOR UPDATE não é um UPDATE. É um SELECT que também coloca um bloqueio, de forma que impacta a consistência de leitura de outras sessões.