- Este tópico contém 9 respostas, 4 vozes e foi atualizado pela última vez 16 anos, 8 meses atrás por
rodrigobonela.
-
AutorPosts
-
17 de março de 2009 às 9:18 pm #85842
rodrigobonela
ParticipanteBoa tarde pessoal,
Preciso de uma grande ajuda.
Na consultoria que trabalho, várias pessoas tem o mesmo usuário de banco, com isso podem haver muitas mudanças na estrutura das tabelas. Gostaria de saber se há possibilidade de fazer uma trigger para gerenciar as alterações feitas nessas tabelas.
Algo tipo:
——————————–
CREATE OR REPLACE TRIGGER secure_tabela
BEFORE DELETE OR INSERT OR UPDATE ONBEGIN
.
.
.
——————————–
Alguém pode me dar este help?
Grande abraço.17 de março de 2009 às 9:23 pm #85843rodrigobonela
ParticipantePessoal apenas corrigindo:
CREATE OR REPLACE TRIGGER secure_tabela
BEFORE ALTER TABLE ONBEGIN
Ao invés de colocar DELETE OR INSERT OR UPDATE tem como colocar ALTER TABLE?
Abraço,
17 de março de 2009 às 9:44 pm #85844Ishii
ParticipanteOlá,
Rodrigo, sim é possível criar esta trigger de DDL, porém acho que seria mais prático para você o uso do AUDIT_TRAIL no Oracle mesmo.
As triggers de DDL podem ser desabilitadas também ou até dropadas…
No init do BD o parametro AUDIT_TRAIL deve estar como TRUE, caso não esteja, coloque este parâmetro como TRUE (será necessário reiniciar o BD).
Para setar o comando do AUDIT há várias opções
http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_4007.htm#SQLRF01107Veja qual será a melhor para vocês, é possível neste caso do AUDIT sim setar várias tabelas ou todo o schema somente para o DDL ou até para DML também…
Qualquer outra dúvida na utilização do AUDIT coloque aqui para que possamos te ajudar.
[]s Ishii
18 de março de 2009 às 3:40 pm #85857hermesmc
ParticipanteIshi,
Mas o Audit grava aonde o log das alterações DDL e DML?
Obrigado
18 de março de 2009 às 4:59 pm #85858rodrigobonela
ParticipanteBom dia a todos,
Ishii você teria um exemplo desta trigger DDL?
Grande abç.18 de março de 2009 às 5:58 pm #85865Ishii
ParticipanteOlá,
1) Todas as alterações com o AUDIT_TRAIL habilitado ficam nas views: DBA_AUDIT_TRAIL, DBA_AUDIT_OBJECT, DBA_AUDIT_STATEMENT e DBA_AUDIT_*, vai depender do tipo de Controle que se quer fazer, por exemplo se for de DDL (alter, create, drop) não será necessário a DBA_AUDIT_STATEMENT pois estes comandos ficam no trail e no object…
2) Trigger DDL:
create or replace trigger create_objects
before create on .schema
begin
raise_application_error (
num => -20000,
msg => 'Voce nao esta autorizado a criar objetos!');
end;
/
Crei esta trigger apenas para que outras pessoas não criem objetos no meu owner… o erro fica assim:
create table ishii_teste (coluna number)ORA-00604: error occurred at recursive SQL level 1
ORA-20000: Voce nao esta autorizado a criar objetos!
ORA-06512: at line 2Você pode incrementar a trigger, por exemplo, colocar uma variável booleana global em uma package e colocar isso na condição do corpo da trigger e somente poderia fazer as criações de objetos no banco se antes setar a variavel para TRUE…ou retornar um erro Oracle mesmo e com isso “confundir” a pessoa que está tentando criar o objeto no seu owner…
Qualquer coisa coloque aqui para que possamos te ajudar…
[]s Ishii
19 de março de 2009 às 2:47 am #85867rodrigobonela
ParticipanteIshii, valew pela dica cara…
To na maior correria aqui na consult, dai vou te que deixar o lance da trigger pra daqui uns dias ainda…
Caso tiver alguma outra dúvida dou um grito… rsrs..
Assim q eu fizer o modelo eu posto p vc dar uma olhada…
Abraço…25 de março de 2009 às 12:32 am #85930rodrigobonela
ParticipanteGalera,
Voltando a falar desta Trigger… É o seguinte…
A trigger será para ter um “controle” das alterações nas tabelas de um determinado schema.
Dai queria fazer um isert em uma tabela que criei que terá as seguintes colunas:
……
Estas informações não sei de onde posso buscar, alguém saberia me dizer?Abç
25 de março de 2009 às 3:54 pm #85936rerodrig
ParticipanteCara, fiz um exemplo bem simples que pode te ajudar…a tabela alterada tem como buscar com a variável ora_dict_obj_name, mas não sei se tem algo específico para as colunas alteradas, talvez você tenha que fazer um tratamento para recuperar isso.
create or replace trigger trg_teste before alter on arius_dev.schema
declare
t dbms_standard.ora_name_list_t;
v number;
v_retorno varchar2(4000);
begin
dbms_output.put_line('Tabela alterada: ' || ora_dict_obj_name);v := ora_sql_txt(t); for i in 1 .. v loop v_retorno := v_retorno || t(i); end loop; dbms_output.put_line('Código da alteração: ' || v_retorno); dbms_output.put_line('Características anteriores das colunas:'); for c_dados in (select column_name, data_type, data_length, data_precision, data_scale from all_tab_columns where owner = ora_dict_obj_owner and table_name = ora_dict_obj_name) loop dbms_output.put_line('Nome: ' || c_dados.column_name); dbms_output.put_line('Tipo: ' || c_dados.data_type); if c_dados.data_type = 'VARCHAR2' then dbms_output.put_line('Tamanho: ' || c_dados.data_length); else dbms_output.put_line('Tamanho: ' || c_dados.data_precision); dbms_output.put_line('Precisão: ' || c_dados.data_scale); end if; dbms_output.put_line('------------------------------------'); end loop;end;
Acho que a partir do exemplo você consegue fazer o que você precisa.
Falow…abraço
25 de março de 2009 às 4:00 pm #85937rodrigobonela
ParticipanteVlw peda dica ai cara…
Muito obrigado.
Vou testar aqui…
Abç -
AutorPosts
- Você deve fazer login para responder a este tópico.