Pular para o conteúdo
Visualizando 6 posts - 1 até 6 (de 6 do total)
  • Autor
    Posts
  • #103548
    Doids
    Participante

      O problema é o seguinte:

      1 – Create table TESTE_TABELA (campo1 int);

      2 – Create view TESTE_VIEW as select * from TESTE_TABELA;

      3 – ALTER TABLE TESTE_TABELA ADD campo2 int;

      Depois destas ações a minha view esta desatualizada, ou seja, sem o segundo campo criado na tabela (campo2).

      A pergunta é como faço para atualizar a view sem utilizar o create or replace…..?

      Preciso que seja desta forma porque tenho um arquivo SQL gigante que contém vários scripts, e não dá pra ficar varrendo o mesmo verificando se alguem criou algum campo em alguma tabela que faz parte de uma view depois da mesma ja ter sido criada.

      No sqlserver existe a opção sp_refreshview, mas no Oracle não encontrei nada até agora.

      Alguem tem alguma sugestão?

      Obrigado.

      #103550
      Douglas Paiva de Sousa
      Participante

        Eu imagino que realmente não exista esta opção mesmo, pois imagine o oposto se você quisesse que a sua view não tivesse todos os campos de uma tabela aí também ficaria complicado.

        Não sei se vem ao caso, mais ao invés de view você já pensou em utilizar sinônimos? Pois eles sim são atualizados em tempo real.

        Att,

        #103551
        Doids
        Participante

          Apesar de não ter colocado no primeiro post, as view criadas possuem a clausula WHERE.

          Ex:

          Create view TESTE_VIEW as select * from TESTE_TABELA where campo1 > 0;

          Com sinonimos não consigo fazer isso.

          E também vou fazer isso somente para algumas views já que as que não usam todos os campos da tabela não vão precisar de atualização.

          No SQLSEVER ele consegue entender que a view foi criada como select * from tabela, já no oracle ele grava o nome de cada coluna mesmo sendo criada com select *. Este é o problema….

          Voce ou alguem mais tem alguma outra idéia?

          Obrigado.

          #103552
          Douglas Paiva de Sousa
          Participante

            Infelizmente eu não conheço nenhum mecanismo que possa te atender, talvez aquele famoso “workaroud” de criar uma trigger que execute esse processo, mais não sei se seria uma boa ideia.

            Att,

            #103554
            rman
            Participante

              @Doids

              Realmente o SELECT * é traduzido na hora da criação, armazenando os campos presente no momento da criação da VIEW.

              Bom, seguindo as boas práticas não utilize SELECT *, especifique campo a campo. No caso do SELECT * na VIEW deu uma falsa ideia de que todos os campos estão especificados.

              Eu desconheço uma forma de atualizar a VIEW se não for recriando. É de responsabilidade de quem alterar as tabelas manter valido e consistente as VIEWs.

              #103557
              Doids
              Participante

                Pois é , concordo com voce que quem mexer na tabela, deve saber que existem outros objetos coligados.

                O problema é que o pessoal usava o sp_refresh_view no sqlserver e no oracle somente compilava a view, achando que ele atualizaria os campos da mesma.

                Como é a primeira vez que peguei este projeto descobri o furo no processo.

                Se alguem tiver alguma outra sugestão, será bem vinda!

                Obrigado.

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