- Este tópico contém 9 respostas, 4 vozes e foi atualizado pela última vez 13 anos, 12 meses atrás por
rman.
-
AutorPosts
-
25 de junho de 2011 às 1:41 am #99804
airoosp
ParticipanteBoa 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;
beginselect username, machine, command
into v_username, v_machine, v_command
from sys.v_$sessionwhere 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
25 de junho de 2011 às 8:19 am #99807rman
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;
beginselect username, machine, command
into v_username, v_machine, v_command
from sys.v_$sessionwhere 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;
beginselect 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'sinsert 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…
26 de junho de 2011 às 1:56 pm #99810lordmaca
ParticipanteTotalmente correto RMAN, somente com autonomous transaction.
27 de junho de 2011 às 7:01 pm #99818airoosp
ParticipanteBoa tarde,
Fiz a alteração que você comentou e mesmo assim não foi gravado nenhum registro na tabela.
Será que tem que habilitar algum parâmetro do banco?
Obrigado.
Airton
27 de junho de 2011 às 11:13 pm #99823rman
ParticipanteUe…
Realmente foi declarado PRAGMA AUTONOMOUS_TRANSACTION ?
if upper(v_machine) like '%pc1%' then
-- start sql trace for users from pc1
dbms_session.set_sql_trace(true);
Nesta forma nunca vai entrar neste IF. Aplique UPPER() dos dois lados, ou %pc1% em maiusculo
if upper(v_machine) like '%PC1%' then
-- start sql trace for users from pc1
dbms_session.set_sql_trace(true);
Mas creio que o problema de não gravar não é esse IF…
28 de junho de 2011 às 12:00 am #99827airoosp
ParticipanteAcho que a trigger não esta sendo executada.
28 de junho de 2011 às 1:00 am #99829Ishii
ParticipanteOlá,
Olhando com mais calma, acho que essa parte do código
where audsid = userenv('sessionid')
Deveria ser:
where sid = userenv('sessionid')
Teste e nos responda…
[]s Ishii
28 de junho de 2011 às 6:54 pm #99834airoosp
ParticipanteIshii,
Fiz a alteração que você falou e não funcionou.
Airton
28 de junho de 2011 às 7:39 pm #99835airoosp
ParticipanteHabilitei o parâmetro _SYSTEM_TRIG_ENABLED e a trigger funcionou, o estranho foi que a cada sessão a trigger grava duas linhas para o mesmo usuário.
Airton
28 de junho de 2011 às 8:32 pm #99836rman
Participante_SYSTEM_TRIG_ENABLED
Defaults to true and Oracle recommends setting it to false only during database upgrade.If this parameter is set to false, then system triggers won’t be executed.
O padrão é true, alguém deve ter setado false em algum momento, não conhecia o parametro…
-
AutorPosts
- Você deve fazer login para responder a este tópico.