Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá!
Pessoal, sou nova por aqui..
Estou precisando de uma ajuda..
Preciso identificar se uma view criada no banco de dados é 100% igual à estrutura da tabela na qual ela se baseia.
Por exemplo, se eu tenho a tabela XPTO com 5 colunas e 1000 linhas, quero identificar que esta view retorna, ao se realizar um select nela, as mesmas 5 colunas e 1000 linhas, sem nenhum tipo de filtro ou modificação na apresentação das colunas.
No meu caso, posso ter aliases nas views. Ex:
TABELA XPTO
Name Type Nullable Default Comments
--------- ------------ -------- ------- --------
XPTOCOD NUMBER(12)
XPTONOM VARCHAR2(30)
CREATE OR REPLACE VIEW V_XPTO
(COD_XPTO, NOM_XPTO)
AS
SELECT XPTOCOD, XPTONOM FROM XPTO
O que preciso é identificar justamente os casos acima e desconsiderar quando as views não forem 100% da tabela, como nos casos abaixo (entre outros).
CREATE OR REPLACE VIEW V_XPTO
(COD_XPTO, NOM_XPTO, DESCRICAO)
AS
SELECT XPTOCOD, XPTONOM, 'TEXTO'
FROM XPTO
------
CREATE OR REPLACE VIEW V_XPTO
(COD_XPTO, NOM_XPTO)
AS
SELECT XPTOCOD, XPTONOM
FROM XPTO
WHERE COD_XPTO > 10
------
CREATE OR REPLACE VIEW V_XPTO
(COD_XPTO, NOM_XPTO)
AS
SELECT XPTOCOD, XPTONOM
FROM XPTO
GROUP BY XPTOCOD
------
CREATE OR REPLACE VIEW V_XPTO
(COD_XPTO)
AS
SELECT XPTOCOD
FROM XPTO
------
CREATE OR REPLACE VIEW V_XPTO
(NOM_XPTO)
AS
SELECT SUBSTR(XPTONOM,1,2)
FROM XPTO
------
CREATE OR REPLACE VIEW V_XPTO
(COD_XPTO, NOM_XPTO)
AS
SELECT XPTOCOD, XPTONOM
FROM XPTO, ABC
WHERE XPTO.XPTOCOD = ABC.XPTOCOD
Voces conhecem alguma forma de fazer isso??
Obrigada :))Então, tenho acesso DBA, já estou usando a DBA_VIEWS pra extrair o texto, porém desta forma que sugeriu eu teria que avaliar visualmente/manualmente, correto? e no caso de muitas views isso se torna inviável.. No caso agora, eu estou precisando avaliar umas 150 views..
E no caso da ALL_TAB_COLUMNS eu não consigo ter certeza que é a mesma coluna da tabela pois, como eu disse, as colunas das views tem alias.
Mas valeu pela ajuda ;)
Com o texto da view dá para varrer a string e tentar localizar , eu faria uma busca por amostragem e ia tentando ir refinando a select que vai em dba_views
Desculpa se não entendi..
Mas eu teria que varrer se não tem:
WHERE
AND
COUNT
GROUP
( )
< >
=
etc...
fora todas as formas de formatação de colunas possíveis.. é essa sua ideia?
Algo assim :
SELECT OWNER,'VIEW' ,VIEW_NAME,TEXT_VC
FROM DBA_VIEWS
WHERE (UPPER(TEXT_VC) LIKE '%COUNT(%' OR
UPPER(TEXT_VC) LIKE '%GROUP BY%')
pelo menos reduz o universo a ser visto
WHERE - trará quase todos
AND - idem
Entendi, estou fazendo esta busca já, com as strings abaixo..
WHERE COUNT AND GROUP SUM MIN MAX CASE IS NOT IN ORDER | -- JOIN NULL ( ) [ ] = ' / > < + - !
só queria tentar achar uma forma mais otimizada que fizesse com que eu tivesse que fazer o mínimo de comparação manual.
Do meu universo de 150, ainda restaram 75 pra eu comparar manualmente.. é meio inviável fazer isto com frequencia.. ;)
E ainda tem o escopo de colunas que este filtro de "where", "and" e etc.. não trata..
poderia fazer uma FUNCTION para contar algumas ocorrências ,
select where por exemplo só poderiam (no seu caso) ter uma ocorrência
Existe uma VIEW de Metadados que lista as views
DBA_VIEWS
precisa ter acesso de DBA
pela sql
SELECT OWNER,'VIEW' ,VIEW_NAME,TEXT_VC
FROM DBA_VIEWS
Se consegue ter acesso ao "texto" da VIEW
Notas :
as colunas
TEXT LONG() Yes 4 View text
TEXT_VC VARCHAR2(4000) Yes 5 Possibly truncated view text as VARCHAR2
existe também a vew USER_VIEWS limitada as views do user logado
tem alguns "poréns" as do tipo LONG são mais difíceis de tratar e a TEXT_VC creio só existir na versão 12.
outra metadados que pode ser usada é a ALL_TAB_COLUMNS que permite ver as colunas de tabelas ou views , um join entre as tabelas e as views poderia ser feito