- Este tópico contém 5 respostas, 3 vozes e foi atualizado pela última vez 13 anos, 10 meses atrás por
Doids.
-
AutorPosts
-
5 de maio de 2012 às 12:10 am #103548
Doids
ParticipanteO 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.
7 de maio de 2012 às 4:41 am #103550Douglas Paiva de Sousa
ParticipanteEu 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,
7 de maio de 2012 às 4:48 pm #103551Doids
ParticipanteApesar 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.
7 de maio de 2012 às 5:02 pm #103552Douglas Paiva de Sousa
ParticipanteInfelizmente 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,
7 de maio de 2012 às 5:37 pm #103554rman
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.
7 de maio de 2012 às 9:07 pm #103557Doids
ParticipantePois é , 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.
-
AutorPosts
- Você deve fazer login para responder a este tópico.