DaniloTec 0 Denunciar post Postado Março 20, 2012 Bom dia. Estou tentando fazer uma trigger para armazenar os logs do sistema. Quando eu dou um select na V$Session fora trigger eu consigo visualizar as informações, mas quando eu coloco este select dentro da trigger ocorre o erro. Qual a diferença de executar dentro ou fora da trigger? Alguma coisa deve mudar? Grato. Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Março 20, 2012 V$Session é um sinônimo de V_$Session, este uma VIEW de SYS. O usuário pode não ter permissão. Fiz um teste aqui com um bloco anômimo e não deu erro. BEGIN FOR r IN (SELECT * FROM V$SESSION) loop NULL; END loop; end; Mas rodei num user que é DBA. ________________________________________________________________________________ O usuário do select é o mesmo que executa a operação que dispara a trigger ? Compartilhar este post Link para o post Compartilhar em outros sites
DaniloTec 0 Denunciar post Postado Março 20, 2012 Sim. Os usuários são os mesmos. Eu rodo a query fora e dá certo, mas dentro não. Eu acredito que o usuário seja o mesmo. Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Março 20, 2012 Testou chamando a trigger pelo banco, isto é fazendo o insert/update/delete direto no banco para ver se o erro ocorre ? Compartilhar este post Link para o post Compartilhar em outros sites
DaniloTec 0 Denunciar post Postado Março 20, 2012 Motta, o problema é que nem compila. Se eu tiro o trecho que está o select a trigger funciona perfeitamente. Mas quando eu coloco da erro de compilação. Segue o trecho: SELECT PROGRAM, OSUSER, MACHINE INTO Programa, Usuario, Maquina FROM V$SESSION WHERE AUDSID = USERENV('SESSIONID'); Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Março 20, 2012 Fiz um teste aqui : create or replace PROCEDURE TESTE AS Programa VARCHAR2(100); Usuario VARCHAR2(100); Maquina VARCHAR2(100); BEGIN SELECT PROGRAM, OSUSER, MACHINE INTO Programa, Usuario, Maquina FROM SYS.V_SESSION WHERE AUDSID = USERENV('SESSIONID'); END; Erro(13,1): PLS-00103: Encontrado o símbolo "ERRO" Erro(9,12): PL/SQL: ORA-00942: a tabela ou view não existe Então me lembrei agora que uma vez tomei um erro assim. Como revolvi : Criei uma Function [b]em Sys[/b] que retornava o valor requerido. Dei GRANT de execução desta para PUBLIC. Criei um sinônimo público para esta Função. Talvez uma VIEW no mesmo esquema fincione também. No caso terá de ser passado três valores, você pode resolver isto passando uma string concatenada, ou criando um TYPE e retornando este TYPE. Mas muitos dados são retornados por USERENV SELECT USERENV('CLIENT_INFO'),USER,USERENV('TERMINAL') from dual não sendo necessário ir no V$SESSION. Compartilhar este post Link para o post Compartilhar em outros sites