Colega, antes de sair fazendo, imho vc ** tem ** que saber Exatamente a 
necessidade, para que será usado, enfim... Se é para Auditoria, eu recomendaria 
fortemente que vc usasse as opções built-in de Auditoria e simplesmente 
IGNORASSE as gambis com trigger, pois entre outros fatores :

- via de regra triggers interferem mais FORTEMENTE em performance do que a 
Auditoria nativa

- nós NÂO temos uma trigger de DML (insert/update/delete) a nível de database, 
aí vc TERÁ que ter uma trigger para cada tabela de cada schema que vc quer 
"auditar"

- afaik provavelmente vc precisará dar GRANTs de consultas em tabelas internas 
(principalmente V$SESSION e V$SQL), já que há casos em que as built-ins de 
captura de eventos de sistema e similares (como a ORA_SQL_TEXT, que seria a de 
seu interesse no caso) não são populadas e/ou não podem ser usadas  em triggers 
de DML : 
http://topdataway.blogspot.com.br/2008/11/get-sql-using-orasqltxt-via-trigger.html
 nos fala sobre isso...

E há um ponto importante : se o database for 11g (R2,afaik), em a Auditoria 
nativa sendo setada para 'DB' o texto e os binds já são Automaticamente 
capturados na AUD$, o que elimina qquer necessidade de manipulação via 
trigger.... Se o seu database for 10g ou superior, sempre há também a 
possibilidade de usar FGA (Fine-Grainde Audit), essa built-in já captura o 
texto do SQL, já que seu db é 11g : 
http://mportes.blogspot.com.br/2005/05/audit-trail-fga-fine-grained-audit-10g.html
 é um exemplo antigo mas ainda funcional .... 
 E claro, se a Audit for temporária, vc sempre tem a chance de Ativar um trace 
de SQL, via logon trigger ou quetais...

=> Então a sua resposta é : Entenda a necessidade, Analise se é possível/viável 
usar as rotinas built-in (POUPANDO tempo/esforço e muito provavelmente 
intereferindo menos com performance), E se não for só então, muito de 
má-vontade, vc parte pras triggers, testando se no seu caso as built-ins de 
captura de eventos atendem, experimente pegar o SQL_ID numa trigger BEFORE 
statement, é por aí que vão ser as gambis....

 []s

    Chiappa


--- Em oracle_br@yahoogrupos.com.br, Marcos de Moura Gonçalves <mgmarcos@...> 
escreveu
>
> Olá Srs,
> 
> Me solicitaram a criação de uma trigger disparada por eventos DML que
> grave o SQL que ocasionou o disparo da trigger. Já tinha feito algo
> parecido no Oracle 10g, e lembrava que bastava fazer o join entre
> v$session e v$sql na coluna sql_id para encontrar o SQL realizado.
> Entretanto essa demanda é para um banco 11g, e pelo que reparei houve
> uma mudança  na informação gravada na v$session: ele guarda o sql_id
> do próprio SELECT realizado na v$session... Experimentei também a
> junção através da coluna prev_sql_id, mas me traz outro SQL que não o
> que disparou a trigger. Outra alternativa que tentei foi utilizar a
> função ORA_SQL_TXT, muito utilizada normalmente em exemplos de quem
> quer fazer auditoria de comandos DDL. Entretanto, pelo menos nas
> minhas tentativas em triggers de UPDATE, essa função não trouxe nada
> (li em algum forum que essa função estaria funcionando no 11g apenas
> para triggers de eventos de sistema, e não DML). Estou pesquisando
> alternativas ainda sem sucesso. Alguém tem alguma idéia?
> 
> Obrigado,
> 
> Marcos de Moura Gonçalves
>


Responder a