Trigger de auditoria para um determinado usuário

#99807
Avatar de rmanrman
Participante

[quote=”airoosp”:3lsawgse]Boa tarde,

Pesquisa na internet sobre triggers de auditoria encontrei o script abaixo. A trigger foi criada assim como a tabela mas ao fazer testes com o usuário scott nada foi gravado na planilha. (banco 9i)

Login com usuário sys para criar a tabela e a trigger.

CREATE TABLE user_login_audit (
login_time DATE,
username VARCHAR2(30),
machine VARCHAR2(30),
command VARCHAR2(128)
);

create or replace trigger user_login_trig
after logon on scott.schema
declare
v_username sys.v_$session.username%type;
v_machine sys.v_$session.machine%type;
v_command sys.v_$session.command%type;
begin

select username, machine, command
into v_username, v_machine, v_command
from sys.v_$session

where audsid = userenv(‘sessionid’)
and audsid != 0 — don’t check sys connections
and rownum = 1; — parallel processes will have the same audsid’s
insert into sys.user_login_audit
values (sysdate, v_username, v_machine, v_command);
if upper(v_machine) like ‘%pc1%’ then
— start sql trace for users from pc1
dbms_session.set_sql_trace(true);

end if;
end;

Depois login com usuário scott, executada uma consulta em uma tabela.

Novamente login com usuário sys e executada a query abaixo.

select * from sys.user_login_audit (sem registros)

Há alguma coisa errada na criação da trigger?

Obrigado.

Airton[/quote]

Analisando a trigger, vi é que feito um INSERT, mas não tem nenhum COMMIT.

Creio que unica forma de dar COMMIT dentro de uma trigger é fazendo uma transação autonoma.

Tente da seguinte forma:


create or replace trigger user_login_trig
after logon on scott.schema
declare
v_username sys.v_$session.username%type;
v_machine sys.v_$session.machine%type;
v_command sys.v_$session.command%type;
PRAGMA AUTONOMOUS_TRANSACTION;
begin

select username, machine, command
into v_username, v_machine, v_command
from sys.v_$session
where audsid = userenv('sessionid')
and audsid != 0 -- don't check sys connections
and rownum = 1; -- parallel processes will have the same audsid's

insert into sys.user_login_audit
values (sysdate, v_username, v_machine, v_command);

COMMIT;

if upper(v_machine) like '%pc1%' then
-- start sql trace for users from pc1
dbms_session.set_sql_trace(true);

end if;
end;

O uso de transação autonoma geralmente deve ser usado em ultimo recurso. Então fica a pergunta, é possível resolver isso sem o uso da transação autonoma? Pra mim é o unico jeito…

plugins premium WordPress