Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

DaniloTec

V$Session e Trigger

Recommended Posts

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

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

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

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

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

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

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.