Pular para o conteúdo
  • Este tópico contém 9 respostas, 4 vozes e foi atualizado pela última vez 16 anos, 8 meses atrás por rodrigobonela.
Visualizando 10 posts - 1 até 10 (de 10 do total)
  • Autor
    Posts
  • #85842
    rodrigobonela
    Participante

      Boa 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 ON BEGIN
      .
      .
      .
      ——————————–
      Alguém pode me dar este help?
      Grande abraço.

      #85843
      rodrigobonela
      Participante

        Pessoal apenas corrigindo:
        CREATE OR REPLACE TRIGGER secure_tabela
        BEFORE ALTER TABLE ON

        BEGIN

        Ao invés de colocar DELETE OR INSERT OR UPDATE tem como colocar ALTER TABLE?

        Abraço,

        #85844
        Ishii
        Participante

          Olá,

          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#SQLRF01107

          Veja 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

          #85857
          hermesmc
          Participante

            Ishi,

            Mas o Audit grava aonde o log das alterações DDL e DML?

            Obrigado

            #85858
            rodrigobonela
            Participante

              Bom dia a todos,
              Ishii você teria um exemplo desta trigger DDL?
              Grande abç.

              #85865
              Ishii
              Participante

                Olá,

                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 2

                Você 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

                #85867
                rodrigobonela
                Participante

                  Ishii, 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…

                  #85930
                  rodrigobonela
                  Participante

                    Galera,
                    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ç

                    #85936
                    rerodrig
                    Participante

                      Cara, 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

                      #85937
                      rodrigobonela
                      Participante

                        Vlw peda dica ai cara…
                        Muito obrigado.
                        Vou testar aqui…
                        Abç

                      Visualizando 10 posts - 1 até 10 (de 10 do total)
                      • Você deve fazer login para responder a este tópico.