Entrar

OracleBR

Scripts

Inicial - Banco de Códigos

Gera Script de Log

Data de Inclusão: 02/09/2006 | Última Alteração: 02/09/2006
Tipo:Scripts | Enviada por: Moderador Oracle_br (moderador@oraclebr.com.br)


/*
Este script gera 2 outros scripts:

1) script de criação da tabela de log
2) script de criação do trigger de log

Observações
===========
Alterar o script ou criar a pasta C:\LIXO, que é onde os 2 scripts serão criados;
Alterar o nome do trigger no script gerado.


Exemplo:

SQL> c:\gera_script_log NOME_DA_TABELA

Scripts que serão criados:

C:\LIXO\cria_tabela_log.sql
C:\LIXO\cria_trigger_log.sql


SQL> @c:\lixo\cria_tabela_log.sql

SQL> @c:\lixo\cria_trigger_log.sql

*/
--------------------------------------------------------------------------------
set serveroutput on size 10000;
set trimspool on;
set feedback off;
set verify off;
spool c:\lixo\cria_tabela_log.sql;
declare
v_nome_tabela varchar2(30) := upper('&1');
v_contador number(10);
--
cursor c1 is
select *
from user_tab_columns
where table_name = v_nome_tabela
order by column_id;
begin
select count(*)
into v_contador
from user_tab_columns
where table_name = v_nome_tabela;
--
if v_contador = 0
then
raise_application_error(-20001, 'Esta tabela não existe ou não pertence a este usuário.');
end if;
--
-- cria a tabela de log
--
--dbms_output.put_line('drop table LOG_' || v_nome_tabela);
--dbms_output.put_line('/');
dbms_output.put_line('create table LOG_' || v_nome_tabela || ' (');
--
v_contador := 1;
--
for r1 in c1
loop
dbms_output.new_line;
if v_contador > 1
then
dbms_output.put(',');
end if;
--
v_contador := v_contador + 1;
dbms_output.put(rpad(lower(r1.column_name), 31, ' ') || lower(r1.data_type));
--
if r1.data_type = 'VARCHAR2'
then
dbms_output.put('(' || r1.data_length || ')');
elsif r1.data_type = 'NUMBER'
then
if nvl(r1.data_precision,0) > 0
then
dbms_output.put('(' || r1.data_precision);
if nvl(r1.data_scale, 0) > 0
then
dbms_output.put(', ' || r1.data_scale);
end if;
dbms_output.put(')');
end if;
end if;
--
if r1.nullable = 'N'
then
dbms_output.put(' not null');
end if;
end loop;
--
dbms_output.new_line;
dbms_output.put_line(',tipo_movimento varchar2(1)');
dbms_output.put_line(',usuario_movimento varchar2(30)');
dbms_output.put_line(',data_movimento date');
--
dbms_output.put_line(')');
dbms_output.put_line('/');
dbms_output.put(chr(10));
end;
/
spool off;
spool c:\lixo\cria_trigger_log.sql;
declare
v_nome_tabela varchar2(30) := upper('&1');
v_contador number(10);
--
cursor c1 is
select *
from user_tab_columns
where table_name = v_nome_tabela
order by column_id;
begin
select count(*)
into v_contador
from user_tab_columns
where table_name = v_nome_tabela;
--
if v_contador = 0
then
raise_application_error(-20001, 'Esta tabela não existe ou não pertence a este usuário.');
end if;
--
--
-- cria o script do trigger
--
dbms_output.put_line('#create or replace');
dbms_output.put_line('# trigger trg_?');
dbms_output.put_line('# before insert or update or delete');
dbms_output.put_line('# on ' || lower(v_nome_tabela));
dbms_output.put_line('# for each row');
dbms_output.put_line('#declare');
dbms_output.put_line('# v_tipo_movimento varchar2(1);');
dbms_output.put_line('# v_diferenca number(10);');
dbms_output.put_line('#begin');
dbms_output.put_line('# select sum(a) - sum(b) d');
dbms_output.put_line('# into v_diferenca');
dbms_output.put_line('# from (select count(column_name) + 3 a');
dbms_output.put_line('# ,0 b');
dbms_output.put_line('# from dba_tab_columns');
dbms_output.put_line('# where table_name = ''' || v_nome_tabela || '''');
dbms_output.put_line('# union all');
dbms_output.put_line('# select 0 a');
dbms_output.put_line('# ,count(column_name) b');
dbms_output.put_line('# from dba_tab_columns');
dbms_output.put_line('# where table_name = ''LOG_' || v_nome_tabela || ''');');
dbms_output.put_line('# --');
dbms_output.put_line('# if v_diferenca <> 0');
dbms_output.put_line('# then');
dbms_output.put_line('# raise_application_error(-20001, ''A tabela LOG_' || v_nome_tabela || ' está desatualizada. Entre em contato com o CPD.'');');
dbms_output.put_line('# end if;');
dbms_output.put_line('# --');
dbms_output.put_line('# if inserting or updating');
dbms_output.put_line('# then');
dbms_output.put_line('# if inserting');
dbms_output.put_line('# then');
dbms_output.put_line('# v_tipo_movimento := ''I'';');
dbms_output.put_line('# else');
dbms_output.put_line('# v_tipo_movimento := ''A'';');
dbms_output.put_line('# end if;');
dbms_output.put_line('# --');
dbms_output.put_line('# insert into log_' || lower(v_nome_tabela));
--
v_contador := 1;
--
for r1 in c1
loop
dbms_output.new_line;
if v_contador = 1
then
dbms_output.put('# (');
else
dbms_output.put('# ,');
end if;
--
v_contador := v_contador + 1;
dbms_output.put(lower(r1.column_name));
end loop;
--
dbms_output.new_line;
dbms_output.put('# ,tipo_movimento');
dbms_output.new_line;
dbms_output.put('# ,usuario_movimento');
dbms_output.new_line;
dbms_output.put('# ,data_movimento)');
dbms_output.new_line;
--
v_contador := 1;
--
for r1 in c1
loop
dbms_output.new_line;
if v_contador = 1
then
dbms_output.put('# values (');
else
dbms_output.put('# ,');
end if;
--
v_contador := v_contador + 1;
dbms_output.put(':new.' || lower(r1.column_name));
end loop;
--
dbms_output.new_line;
dbms_output.put('# ,v_tipo_movimento');
dbms_output.new_line;
dbms_output.put('# ,user');
dbms_output.new_line;
dbms_output.put('# ,sysdate);');
dbms_output.new_line;
--
dbms_output.put_line('# elsif deleting');
dbms_output.put_line('# then');
dbms_output.put_line('# insert into log_' || lower(v_nome_tabela));
--
v_contador := 1;
--
for r1 in c1
loop
dbms_output.new_line;
if v_contador = 1
then
dbms_output.put('# (');
else
dbms_output.put('# ,');
end if;
--
v_contador := v_contador + 1;
dbms_output.put(lower(r1.column_name));
end loop;
--
dbms_output.new_line;
dbms_output.put('# ,tipo_movimento');
dbms_output.new_line;
dbms_output.put('# ,usuario_movimento');
dbms_output.new_line;
dbms_output.put('# ,data_movimento)');
dbms_output.new_line;
--
v_contador := 1;
--
for r1 in c1
loop
dbms_output.new_line;
if v_contador = 1
then
dbms_output.put('# values (');
else
dbms_output.put('# ,');
end if;
--
v_contador := v_contador + 1;
dbms_output.put(':old.' || lower(r1.column_name));
end loop;
--
dbms_output.new_line;
dbms_output.put('# ,''E''');
dbms_output.new_line;
dbms_output.put('# ,user');
dbms_output.new_line;
dbms_output.put('# ,sysdate);');
dbms_output.new_line;
--
dbms_output.put_line('# end if;');
dbms_output.put_line('#end;');
dbms_output.put_line('#/');
end;
/
spool off;
set verify on;
set feedback on;