[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…