- Este tópico contém 12 respostas, 3 vozes e foi atualizado pela última vez 14 anos, 9 meses atrás por
Niggaz.
-
AutorPosts
-
23 de agosto de 2010 às 7:08 pm #95644
Niggaz
ParticipanteBoa tarde galera,
estou criando um trigger para armazenar o momento que determinado schema se logou no banco
Porém eu gostaria de armazenar tbm o OSUSER e PROGRAM que o usuario se conectou…mas não rola do jeito que estou tentando.
CREATE OR REPLACE
TRIGGER TAL AFTER LOGON ON SCHEMA
DECLARE
v_usuario VARCHAR2(30):=null;
BEGIN
SELECT osuser INTO v_usuario FROM V$SESSION WHERE AUDSID = USERENV('sessionid') AND ROWNUM <=1; INSERT INTO LOGON VALUES ('O usuário '||USER||' se conectou as '||TO_CHAR(sysdate,'DD-MM-YYYY HH24:MI:SS')||v_usuario); END;Pelo oq eu percebi, ele não está aceitando o SELECT osuser...fala que a tabela não existe. 8O
Oq poderia resolver isso??
Abs
23 de agosto de 2010 às 7:15 pm #95645Ishii
ParticipanteOlá
Qual o owner dessa trigger? Se não for um com grant DBA ele não tem privilégio na v$session mesmo…se for o caso conceda o privilégio necessário. (Como se trata de uma trigger de auditoria eu normalmente coloco no Sys mesmo, mas isso é uma decisão individual)
select machine, osuser
into vMachine, vOsUser
from v_$session
where sid = SYS_CONTEXT ('USERENV', 'SID') ;Nesse caso eu uso a v_$session e a máquina também do login (ai eu sei se foi remoto ou não…) Outro ponto é o SYS_CONTEXT pois evita o rownum que você utiliza…
[]s Ishii
23 de agosto de 2010 às 7:34 pm #95646Niggaz
ParticipanteOpa, eae Ishii blz?
Então, o usuário tem permissões de DBA sim.
Eu consigo fazer select na session normalmente.Só para ter certeza, eu fui no system(base de teste) e tentei criar a TRIGGER…não funcionou, retornando o mesmo erro.
🙁
23 de agosto de 2010 às 8:03 pm #95647Ishii
ParticipanteOlá,
Mude a query que alimenta a sua variável osuser para o modelo que eu te passei e teste novamente. Se não der, coloque o erro que aparece aqui.
[]s Ishii
23 de agosto de 2010 às 8:16 pm #95648Niggaz
ParticipanteCREATE OR REPLACE TRIGGER TAL AFTER LOGON ON SCHEMA
DECLARE
vMachine VARCHAR2(30);
vOsUser VARCHAR2(30);
BEGIN
select machine, osuser into vMachine, vOsUser from v$session where sid = SYS_CONTEXT ('USERENV', 'SID');
INSERT INTO LOGON2 VALUES
('O usuário '||USER||' se conectou as '||TO_CHAR(sysdate,'DD-MM-YYYY HH24:MI:SS')||vOsUser);
END;
/Erros:
5/56 PL/SQL: ORA-00942: a tabela ou view não existe
5/5 PL/SQL: SQL Statement ignoredOBS: Ele aponta o erro no SCHEMA.
Abs
23 de agosto de 2010 às 8:33 pm #95649Ishii
ParticipanteOlá,
Agora que eu vi na parte do schema deve estar informando qual o owner/schema você quer auditar…
Seria algo assim: scott.SCHEMA ou SYSTEM.SCHEMA .SCHEMA
Tente novamente.
[]s Ishii
23 de agosto de 2010 às 9:42 pm #95653Niggaz
ParticipanteNão funcionou tbm…
Nesse banco q eu quero fazer a auditoria, existem vários schemas…
eu quero auditar todos eles.23 de agosto de 2010 às 10:25 pm #95654Ishii
ParticipanteOlá
Testei numa Base Oracle 10g no usuário SYS o seguinte código:
create or replace trigger traudit after logon on database
declare
v_usuario varchar2(30):=null;
begin
select osuser into v_usuario from v$session where sid = SYS_CONTEXT ('USERENV', 'SID')
and username is not null;
insert into audit_logon values
('o usuário '||v_usuario||' se conectou as '||to_char(sysdate,'dd-mm-yyyy hh24:mi:ss')||v_usuario);
end;
/E funcionou, nesse caso você tem que usar o after logon on DATABASE.
[]s Ishii
ps: mande a msg de Erro Oracle que retorna…23 de agosto de 2010 às 10:44 pm #95655Niggaz
ParticipanteIshii,
eu consegui utilizando os parametros do USERENV , veja:
CREATE OR REPLACE TRIGGER TAL AFTER LOGON ON DATABASE
BEGIN
IF (USER NOT IN ('SYSMAN', 'SYSTEM', 'DBSNMP'))THEN
INSERT INTO LOGON VALUES
(SYS_CONTEXT('USERENV', 'OS_USER')||' conectou na '||USER||' as '||
TO_CHAR(SYSDATE,'DD-MM-YYYY HH24:MI:SS'));
END IF;
END;
/
Funcionou exatamente como eu queria…porém ele insere duas linhas na tabela…com uma diferença de 2/3 segundos. Como faço pra inserir apenas uma linha?
OBS.Da outra forma que vc passou com o select, eu não consegui…deu o mesmo erro.
Abs 😆
23 de agosto de 2010 às 11:45 pm #95656Niggaz
ParticipanteACHO que consegui resolver…
Eu estava testando pelo TOAD, ele deve fazer duas requisições de conexão. Pois executando pelo sqlplus ele insere normalmente! 😀
Vou fazer mais alguns testes e aviso sobre qualquer coisa!
Obrigado ishii!
24 de agosto de 2010 às 4:00 pm #95658Niggaz
ParticipanteAlguém saberia me explicar, pq o TOAD faz duas conexões?
Pelo sqlplus, a trigger grava somente uma linha na tabela(que é oq eu preciso), mas pelo TOAD, ou pelo programa utilizado aqui na empresa(Delphi) a trigger grava duas…oq acontece?
24 de agosto de 2010 às 5:14 pm #95660diegomello
ParticipanteOpa..
No PL/SQL Developer, tu pode escolher a maneira de fazer a conexão com o banco:
~> Multi Session
~> Dual Session
~> Single SessionNo TOAD, deve ter algo parecido.
24 de agosto de 2010 às 6:53 pm #95663Niggaz
ParticipanteEntão diegomello,
eu procurei mas não achei nada a respeito disso. 😥
Eu criei um outro trigger de LOGOFF, para poder mapear o momento que o usuario saiu do banco. Só por curiosidade eu deletei todos os registros da tabela que armazena essas informações e fiz uma conexão com um usuario qualquer, fiz uma consulta na tabela e para minha alegria (:evil:), foram gravadas 3 linhas 😕 .
LOGON : 24-08-2010 10:39:33
LOGOFF: 24-08-2010 10:39:35
e outro LOGON: 24-08-2010 10:39:35 (mesmo momento do LOGOFF).Se eu entendi bem, ele conecta, desconecta e conecta novamente!!!
Aff…coisa de louco! rs
Isso pelo TOAD!
pelo sqlplus? Tudo normal! -
AutorPosts
- Você deve fazer login para responder a este tópico.