Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

macsousa

como verificar movimentacoes em uma tabela

Recommended Posts

Desejo verificar inclusoes / alteracoes ou exclusoes que aconteceram em uma determinada tabela em um determinado periodo de tempo tipo .. durantem 1 dia aconteceu varias atualizacoes inclusoes e exclusoes em uma tabela por varios usuarios... existe como no final do dia eu rodar um script que me retorne a movimentacao ocorrida nesta tabela???

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ola,

 

Pode ser feito isso se o banco de dados estiver no modo ARQUIVELOG e a tiver com a retenção de undo GARANTIDA por 1 dia no seu caso, com isso é possível a recuperação através de queries no dicionário de dados. A view é FLASHBACK_TRANSACTION_QUERY e nela fica armazenada todas as informações de transação efetuadas por commit.

 

http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Outra solução é criar tabela(s) e trigger(s) para tratar e logar algumas alterações, dá um pouco mais de trabalho mas se permite um log mais refinado tratando apenas as alterações relevantes.

 

Basicamente triggers de after insert/update/delete inserem em uma tabela de log.

 

Esta query por exemplo gera parte do código da trigger (compara se a coluna mudou)

 

SELECT 'IF (NVL(:OLD.'||COLUMN_NAME||','||
	   DECODE(DATA_TYPE,'VARCHAR2',QUOTEDSTR(' '),
						'CHAR',QUOTEDSTR(' '),
						'NUMBER','-1',
						'DATE','(SYSDATE-36500)')||') <> ' ||
	   'NVL(:NEW.'||COLUMN_NAME||','||
	   DECODE(DATA_TYPE,'VARCHAR2',QUOTEDSTR(' '),
						'CHAR',QUOTEDSTR(' '),
						'NUMBER','-1',
						'DATE','(SYSDATE-36500)')||')) THEN' LINHA
FROM ALL_TAB_COLUMNS
WHERE OWNER = '...'
AND   TABLE_NAME = '...'
ORDER BY COLUMN_ID

Compartilhar este post


Link para o post
Compartilhar em outros sites

Existe a opção de trabalhar com os eventos do banco de dados por TRIGGERS, segue um exemplo básico apenas para INSERT numa tabela especifica:

 

SQL*Plus: Release 10.2.0.1.0 - Production on Sßb Jan 27 12:51:12 2007Copyright (c) 1982, 2005, Oracle.  All rights reserved.SQL> conn rodrigoalmeidaInforme a senha:Conectado.SQL> create table LOG_AUDIT (tabela varchar2(10), evento varchar2(10), data date);Tabela criada.SQL> create table TAB_TESTE (a varchar2(10), b number(5));Tabela criada.SQL> create or replace trigger TAB_TESTE_AUDIT  2  after insert on tab_teste for each row  3  begin  4	 insert into log_audit values ('TAB_TESTE','INSERT',sysdate);  5  end;  6  /Gatilho criado.SQL> declare  2	 contador integer;  3  begin  4	 contador := 1;  5	 while contador <= 10 loop  6			 insert into tab_teste values ('TESTE',contador);  7			 contador := contador + 1;  8	 end loop;  9  end; 10  /Procedimento PL/SQL concluÝdo com sucesso. SQL> select count(*) from TAB_TESTE;  COUNT(*)----------		10SQL> select tabela, evento, to_char(data,'DD-MM-RRRR HH24:MI:SS') from LOG_AUDIT;TABELA	 EVENTO	 TO_CHAR(DATA,'DD-MM---------- ---------- -------------------TAB_TESTE  INSERT	 27-01-2007 12:57:53TAB_TESTE  INSERT	 27-01-2007 12:57:53TAB_TESTE  INSERT	 27-01-2007 12:57:53TAB_TESTE  INSERT	 27-01-2007 12:57:53TAB_TESTE  INSERT	 27-01-2007 12:57:53TAB_TESTE  INSERT	 27-01-2007 12:57:53TAB_TESTE  INSERT	 27-01-2007 12:57:53TAB_TESTE  INSERT	 27-01-2007 12:57:53TAB_TESTE  INSERT	 27-01-2007 12:57:53TAB_TESTE  INSERT	 27-01-2007 12:57:5310 linhas selecionadas.SQL>

bem simples, para melhorar você pode colocar os eventos de DELETE e UPDATE na tabela ou no owner, tanto faz, assim irá acompanhar o que as tabelas estão fazendo.

 

Abraços, http://forum.imasters.com.br/public/style_emoticons/default/dormindo.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.