Forum Stats

  • 3,769,970 Users
  • 2,253,039 Discussions
  • 7,875,254 Comments

Discussions

Trigger para gravar o comando executado

user10940944
user10940944 Member Posts: 12
edited May 9, 2017 3:29PM in SQL and PL/SQL (Portuguese)

Salve a todos,

Ultimamente estou utilizando bastante o forum rsrs.

Bom meu problema dessa vez é criar uma trigger que grave os comando delete de uma determinada tabela.

Toda vez que ocorrer um delete na tabela gostaria de inserir um registro desse comando.

Criei essa trigger mas ela sempre coloca null no current_sql.

CREATE OR REPLACE TRIGGER CESAR.TRIGGER2

     AFTER DELETE

     ON CESAR.TESTE_TRIGGER1

  FOR EACH ROW

DECLARE

  VUSER VARCHAR2(32 CHAR);

BEGIN

  SELECT USER INTO VUSER FROM DUAL;

  INSERT INTO CESAR.TESTE_TRIGGER VALUES (1,  SYS_CONTEXT('USERENV','CURRENT_SQL'), SYSDATE, VUSER, SYS_CONTEXT('USERENV', 'OS_USER'), SYS_CONTEXT('USERENV', 'IP_ADDRESS'), :OLD.ID, :OLD.TEXTO);

END;

/


Se alguém puder me ajudar agradeço.

Best Answer

  • caadecarvalho
    caadecarvalho Member Posts: 412
    edited May 2, 2015 4:54PM Accepted Answer

    Olá,

    Você pode criar uma política de FGA e uma procedure para registrar em uma tabela de log, porém a procedure deve ser autônoma. Abaixo segue um exemplo para você se basear:

    BEGIN
    
    DBMS_FGA.ADD_POLICY(
       object_schema    => 'HR', 
       object_name        => 'TAB1', 
       policy_name        => 'FGA_01', 
       handler_schema         => 'HR', 
       handler_module         => 'INSERT_LOG', 
       enable                 => TRUE, 
       statement_types        => 'DELETE',
       audit_trail            => DBMS_FGA.DB); 
    
    COMMIT;
    
    END;
    /
    
    
    
    CREATE OR REPLACE PROCEDURE HR.INSERT_LOG (L_SCHEMA IN VARCHAR, L_TABLE IN VARCHAR2, L_POLICY IN VARCHAR2) IS
    PRAGMA AUTONOMOUS_TRANSACTION;
    BEGIN
    
    INSERT INTO HR.TAB_LOG (USERSQL, USERNAME, OSUSER) VALUES (SYS_CONTEXT('USERENV','CURRENT_SQL'), SYS_CONTEXT('USERENV','SESSION_USER'), SYS_CONTEXT('USERENV','OS_USER'));
    COMMIT;
    
    END;
    /
    
    SQL> select * from tab1;
    
           NUM STR
    ---------- ----------
             1 A
             2 B
             3 C
             4 D
    
    SQL> delete from tab1 where num = 3;
    
    1 row deleted.
    
    SQL> commit;
    
    Commit complete.
    
    SQL> select * from tab_log;
    
           NUM
    ----------
    USERSQL
    ----------------------------------------------------------------------------------------------------
    DT        USERNAME                       OSUSER
    --------- ------------------------------ ------------------------------
    IPADDR                            OLD_NUM OLD_STR
    ------------------------------ ---------- ----------
    
    delete from tab1 where num = 3
              HR                             oracle
    
    
    
    delete from tab1 where num = 3
              HR                             oracle
    
    
    
    

    Abraços.

Answers

  • user10940944
    user10940944 Member Posts: 12
    edited Apr 29, 2015 7:36PM

    Bom,

    Pelo que pesquisei current_sql é pra ser usado na package dbms_fga. Bem legal por sinal.

    Mas agora estou com o problema que mesmo que o usuário não commit o delete, ela esta gerando insert na tabela de log.

    Alguém ja utilizou essa package e pode me ajudar?

  • caadecarvalho
    caadecarvalho Member Posts: 412
    edited May 2, 2015 4:54PM Accepted Answer

    Olá,

    Você pode criar uma política de FGA e uma procedure para registrar em uma tabela de log, porém a procedure deve ser autônoma. Abaixo segue um exemplo para você se basear:

    BEGIN
    
    DBMS_FGA.ADD_POLICY(
       object_schema    => 'HR', 
       object_name        => 'TAB1', 
       policy_name        => 'FGA_01', 
       handler_schema         => 'HR', 
       handler_module         => 'INSERT_LOG', 
       enable                 => TRUE, 
       statement_types        => 'DELETE',
       audit_trail            => DBMS_FGA.DB); 
    
    COMMIT;
    
    END;
    /
    
    
    
    CREATE OR REPLACE PROCEDURE HR.INSERT_LOG (L_SCHEMA IN VARCHAR, L_TABLE IN VARCHAR2, L_POLICY IN VARCHAR2) IS
    PRAGMA AUTONOMOUS_TRANSACTION;
    BEGIN
    
    INSERT INTO HR.TAB_LOG (USERSQL, USERNAME, OSUSER) VALUES (SYS_CONTEXT('USERENV','CURRENT_SQL'), SYS_CONTEXT('USERENV','SESSION_USER'), SYS_CONTEXT('USERENV','OS_USER'));
    COMMIT;
    
    END;
    /
    
    SQL> select * from tab1;
    
           NUM STR
    ---------- ----------
             1 A
             2 B
             3 C
             4 D
    
    SQL> delete from tab1 where num = 3;
    
    1 row deleted.
    
    SQL> commit;
    
    Commit complete.
    
    SQL> select * from tab_log;
    
           NUM
    ----------
    USERSQL
    ----------------------------------------------------------------------------------------------------
    DT        USERNAME                       OSUSER
    --------- ------------------------------ ------------------------------
    IPADDR                            OLD_NUM OLD_STR
    ------------------------------ ---------- ----------
    
    delete from tab1 where num = 3
              HR                             oracle
    
    
    
    delete from tab1 where num = 3
              HR                             oracle
    
    
    
    

    Abraços.

  • user10940944
    user10940944 Member Posts: 12
    edited May 7, 2015 5:22PM

    Opa desculpa pela demora,

    Então mas o meu problema é que mesmo sem o commit ele esta gravando o registro.

    Eu preciso que somente se o commit for feito ele grave na tabela de log.

    Ou caso seja feito um rollback ele de rollback na tabela de log tb.

    Porque se o rollback é feito não me interessa o comando, visto que ele não foi efetivado na minha base.

  • caadecarvalho
    caadecarvalho Member Posts: 412
    edited May 13, 2015 12:25AM

    Olá, não existe nenhuma outra trigger para esta tabela? O insert só deveria ser confirmado se você o fizesse na sessão.

  • Ever Santoro
    Ever Santoro Member Posts: 10
    edited May 9, 2017 3:22PM

    A trigger faz parte da mesma transação que a disparou, verifique se não está sendo dado commit em outro local.

  • Tércio Costa
    Tércio Costa Member Posts: 61
    edited May 9, 2017 3:29PM

    Olá Ever, por favor, evite comentar em posts tão antigos assim, esse aqui tem mais de 2 anos e já foi respondido.