Trigger de Auditoria

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
lyccos
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 7
Registrado em: Ter, 08 Jun 2010 1:18 pm
Localização: Porto Alegre\RS

Boa tarde

Trabalho com EBS e algum processo ou usuário está zerando o campo preço de uma tabela de ordem de compra e não estamos conseguindo dentificá-lo, pensei em criar uma trigger de auditoria que seja disparada quando houver um update com o valor 'Zero' no campo "preço" da tabela ordem_de_compra, essa trigger deverá captar os dados da tabela V$MYSTAT, onde tem o SID e a partir deste acessar a V$SESSION onde tem as demais informações e disparar um alert para o meu e-mail. Contudo sou novato em PL\SQl e estou com um pouco de dificuldade em montar este objeto, alguém pode me ajudar?

Obrigado!

Lyccos
paulochagas
Moderador
Moderador
Mensagens: 86
Registrado em: Qua, 15 Mar 2006 2:46 pm
Localização: São Paulo - SP
Paulo Chagas Filho
__________________

Analista Funcional / Desenvolvedor Oracle EBS
MSN - paulochagas@hotmail.com
Gtalk - pachafi@gmail.com
Skype - paulochagas

Boa tarde Lyccos

O EBS contem para a maioria de suas tabelas os campos:

Selecionar tudo

 CREATION_DATE
 CREATED_BY
 LAST_UPDATE_DATE 
 LAST_UPDATED_BY
Será que esses campos não servem como um controle?
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Oi Paulo

O problema é se outro processo muda logo após, daí essas informações já estarão erradas, pois vão estar mostrando do último que alterou. Não tem como garantir que a pessoa que deixou ZERO é a mesma que ta ali.. :-(

Eu acho que a idéia da trigger é boa sim...

Dá uma olhada nesse topico: Com USERENV tem como pegar várias informações como TERMINAL, OSUSER...
http://glufke.net/oracle/viewtopic.php?t=35

Caso tenha algum DBA por aí com privilégios, tem como usar outras ferramentas:
http://glufke.net/oracle/viewtopic.php?t=6004

Aqui tem uma forma de encontrar qual procedure/function que está rodando dinamicamente. Teria que testar se ela funciona de dentro de uma trigger :-)
http://glufke.net/2007/10/03/descobrir- ... micamente/

Se tiver alguma duvida, prende o grito !!!

:-o
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Estive pensando melhor... O Userenv provavlemente não ia funcionar, já que você ta no EBS. Certamente ele ia apontar apenas pro servidor de aplicação.

já pra saber QUEM foi, acho que a idéia da trigger + campos do apps que o Paulo citou!!! OU buscar direto o fnd_global.user_id.

Também pode pegar o fnd_global.conc_request_id pra saber o numero do REQUEST_ID, caso tenha sido executado de um concurrent.

E pra finalizar, tem a rotina que eu citei acima que promete trazer QUAL procedure que chamou. Tudo isso deve dar uma dica de quem está alterando.

Monta uma trigger AFTER UPDATE no campo PREÇO. Dai ali dentro testa se o preço = 0 pra disparar o email com todas esas informações.

Outra forma, é tentar encontrar +ou- a rotina que ta fazendo isso, buscando todos programas que estão alterando esse campo. (Faz uma busca na ALL_SOURCE pra achar as procedures)


:-o
lyccos
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 7
Registrado em: Ter, 08 Jun 2010 1:18 pm
Localização: Porto Alegre\RS

Obrigado Thomas

Consegui fazer

Criei a tabela abaixo:

Selecionar tudo

CREATE TABLE RN_PO_AUDIT_REQ_TST (
  requisition_line_id            NUMBER         NULL,
  requisition_header_id          NUMBER         NULL,
  item_description               VARCHAR2(240)  NULL,
  unit_price                     NUMBER         NULL,
  quantity                       NUMBER         NULL,
  last_update_date               DATE           NULL,
  last_update_login              NUMBER         NULL,
  creation_date                  DATE           NULL,
  created_by                     NUMBER         NULL,
  destination_organization_id    NUMBER         NULL)
E a Trigger abaixo:

Selecionar tudo

CREATE or replace TRIGGER RN_PO_007_T
AFTER INSERT or UPDATE of UNIT_PRICE
ON po_requisition_lines_ALL
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
WHEN (nvl(old.unit_price , new.unit_price) = 0)
BEGIN
INSERT INTO apps.RN_PO_AUDIT_REQ_TST
values (
       nvl(:old.requisition_line_id, :new.requisition_line_id),
       nvl(:old.requisition_header_id       , :new.requisition_header_id     ),
       nvl(:old.item_description            , :new.item_description          ),
       nvl(:old.unit_price                  , :new.unit_price                ),
       nvl(:old.quantity                    , :new.quantity                  ),
       nvl(:old.last_update_date            , :new.last_update_date          ),
       nvl(:old.last_update_login           , :new.last_update_login         ),
       nvl(:old.creation_date               , :new.creation_date             ),
       nvl(:old.created_by                  , :new.created_by                ),
       nvl(:old.destination_organization_id , :new.destination_organization_id)
);
end; 
Só tem um problema, não sei de que tabela buscar o last_update_login, que me retornou um número como esse '130121869'.
Vocês tem idéia?

Abraço!

Lisandro 8)
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

É FND_USER , tem um campo USER_ID... veja se é isso mesmo!
lyccos
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 7
Registrado em: Ter, 08 Jun 2010 1:18 pm
Localização: Porto Alegre\RS

Bom dia Thomas

Eu me equivoquei e estava buscando o campo LAST_UPDATE_LOGIN, quando deveria buscar o LAST_UPDATE_BY, agora funcionou.

Valeu gente!

Abraço!

Lisandro
Responder
  • Informação
  • Quem está online

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