Manter logs de comandos efetuados

DBA Geral (instalação, configuração do banco, scripts do Sql*Plus, shell scripts, batch scripts, etc...)
Responder
jks1903
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 188
Registrado em: Qui, 04 Fev 2010 8:08 am

Pessoal, boa tarde.
Estou com uma dúvida e acredito que ela se encaixe melhor nessa categoria.

Eu precisaria manter um log com os comandos executados por usuários no banco de dados.

Por exemplo, se um usuário rodar uma query "SELECT * FROM TABELA", gostaria de armazenar o usuário, horário e o comando executado.

É possível fazer isso?

Obrigado.
Avatar do usuário
stcoutinho
Moderador
Moderador
Mensagens: 850
Registrado em: Qua, 11 Mai 2011 5:15 pm
Localização: são Paulo - SP

Olá jks1903,

O ORACLE não dispõe de TRIGGERS que capturem, por exemplo um SELECT que seja feito em uma determinada tabela.

ENTRETANTO, o ORACLE oferece a package DBMS_FGA, que você pode utilizar para gerar uma espécie de auditoria para comandos de SELECT disparado contra tabelas.

Existe um excelente artigo que descreve em detalhes - didaticamente - como implementar uma auditoria como esta.

O link deste artigo ("Select Trigger in Oracle Database – introducing Fine Grained Auditing") é o seguinte :

http://technology.amis.nl/2005/09/26/se ... -auditing/

Espero que o artigo lhe ajude a criar o controle que você deseja.

Pode ser que existam outras formas de criar este tipo de controle. Talvez os foristas possam lhe sugerir outras soluções neste sentido.

Abraços,

Sergio Coutinho
jks1903
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 188
Registrado em: Qui, 04 Fev 2010 8:08 am

Ajudou mesmo.
Na verdade minha intenção é capturar os UPDATES ao invés dos SELECTs, porém o que eu não conseguia era como pegar o que foi executado.

Vou adaptar isso em uma trigger de UPDATE mesmo para ver se consigo.


Vlw pela ajuda.
gleisoncandido
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 8
Registrado em: Dom, 20 Mai 2012 2:29 pm
Contato:

Ola jks1903, tudo bem.
já passei por isso algumas vezes e tive q montar uma trigger para pegar os eventos do update , segue abaixo o script que montei , espero que lhe ajude.

Selecionar tudo

  CREATE OR REPLACE TRIGGER "GLEISON"."LOGALTERACAO" 
 AFTER 
 UPDATE OF QTINDENIZ
 ON PCEST
 REFERENCING OLD AS OLD NEW AS NEW
 FOR EACH ROW 
DECLARE
  vsmaquina  VARCHAR2(80);
  vsusuario  VARCHAR2(80);
  vsprograma VARCHAR2(80);
BEGIN
  BEGIN
      SELECT SUBSTR(terminal, 1, 80),
           SUBSTR(osuser, 1, 80),
           SUBSTR(program, 1, 80)
      INTO vsmaquina, vsusuario, vsprograma
      FROM usuarios_logados
     WHERE audsid = USERENV('SESSIONID')
       AND rownum = 1;
  EXCEPTION
    WHEN NO_DATA_FOUND THEN
      vsmaquina  := SYS_CONTEXT('USERENV', 'TERMINAL');
      vsusuario  := SYS_CONTEXT('USERENV', 'OS_USER');
      vsprograma := SYS_CONTEXT('USERENV', 'MODULE');
  END;

  INSERT INTO LOGALTERACAO (CODPROD,QTANTES,QTDEPOIS,MAQUINA,USUARIO,PROGRAMA,DATA)
  VALUES (:NEW.CODPROD,:OLD.QTINDENIZ,:NEW.QTINDENIZ,VSMAQUINA,VSUSUARIO,VSPROGRAMA,SYSDATE );

END LOGALTERACAO;
ALTER TRIGGER "GLEISON"."LOGALTERACAO" ENABLE
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 9 visitantes