Pular para o conteúdo

Fóruns Banco de dados Oracle Trigger de auditoria para um determinado usuário Trigger de auditoria para um determinado usuário

#99807
rman
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…