Como localizo um objeto que parece não existir na tabela de objetos?

11

Eu tenho um objeto chamado cot_ntn_pi_v. Foi-me dito que isso era um sinônimo. Não aparece na tabela all_synonym. Parece uma exibição ou tabela, mas não consigo encontrá-lo na tabela de todos os objetos. Posso selecioná-lo, mas não posso descartá-lo porque 'não existe' e não consigo criar uma nova tabela com o mesmo nome que 'o nome já está sendo usado por outro objeto'.

Estou ficando louco ou fazendo algo realmente estúpido?

BON
fonte
1
Se você não tiver permissões no item, ele pode não aparecer nas tabelas ALL_ *. Você pode precisar de um logon administrativo e procurar nas tabelas do dicionário de dados DBA_ *.
ConcernedOfTunbridgeWells

Respostas:

11

Os tipos de objetos no mesmo espaço para nome que uma tabela são:

  • Procedimentos independentes
  • Funções armazenadas independentes
  • Pacotes
  • Tipos definidos pelo usuário
  • Sequências
  • Visualizações
  • Sinônimos privados
  • Visualizações materializadas

Portanto, é provavelmente um desses tipos. Se você pode selecionar, ele exclui os cinco primeiros, deixando-o como tabela, visualização, sinônimo privado ou visualização materializada.

Quando você pesquisou, all_objectsetc., usou maiúsculas? Por exemplo,

select *
  from ALL_OBJECTS
 where OBJECT_NAME = 'COT_NTN_PI_V'; 

Se você usar alguma ferramenta como SQL Developer ou Toad, deixe-a descrever o objeto para você. Destaque o nome na ferramenta e clique Shift-F4em Developer ou F4no Toad. O Toad fornece muitas descrições sobre o objeto, enquanto o Developer, na guia Detalhes, terá uma linha com TABLE_NAMEou MVIEW_NAMEnele e isso mostrará o que é.

Depois que você souber o que é, será mais fácil saber como descartá-lo.

John Doyle
fonte
Sim, usando sql developer e shift + f4, consegui descobrir o que precisava! Obrigado :)
BON
4

Talvez você não consiga ver o objeto nas tabelas ALL_% se não tiver concessões no próprio objeto, portanto, verifique a tabela DBA_OBJECTS (você precisará de concessões / um usuário adequadamente concedido para fazer isso):

select * 
from DBA_OBJECTS
where object_name = 'COT_NTN_PI_V';

Se isso não produzir nenhuma saída, você poderá verificar as tabelas brutas do dicionário de dados Oracle com esta consulta:

select u.name as owner, o.name as object_name, 
 decode(o.type#, 0, 'NEXT OBJECT', 1, 'INDEX', 2, 'TABLE', 3, 'CLUSTER',
 4, 'VIEW', 5, 'SYNONYM', 6, 'SEQUENCE',
 7, 'PROCEDURE', 8, 'FUNCTION', 9, 'PACKAGE',
 11, 'PACKAGE BODY', 12, 'TRIGGER',
 13, 'TYPE', 14, 'TYPE BODY',
 19, 'TABLE PARTITION', 20, 'INDEX PARTITION', 21, 'LOB',
 22, 'LIBRARY', 23, 'DIRECTORY', 24, 'QUEUE',
 28, 'JAVA SOURCE', 29, 'JAVA CLASS', 30, 'JAVA RESOURCE',
 32, 'INDEXTYPE', 33, 'OPERATOR',
 34, 'TABLE SUBPARTITION', 35, 'INDEX SUBPARTITION',
 39, 'LOB PARTITION', 40, 'LOB SUBPARTITION',
 43, 'DIMENSION',
 44, 'CONTEXT', 47, 'RESOURCE PLAN',
 48, 'CONSUMER GROUP',
 51, 'SUBSCRIPTION', 52, 'LOCATION', 56, 'JAVA DATA', 'UNKNOWN') as type,
o.ctime, o.mtime,
 to_char(o.stime, 'YYYY-MM-DD:HH24:MI:SS'),
 decode(o.status, 0, 'N/A', 1, 'VALID', 'INVALID') as status
 from sys.obj$ o, sys.user$ u
 where o.owner# = u.user#
 and o.linkname is null
 and (o.type# not in (1 , 10) or
 (o.type# = 1 and 1 = (select 1
 from sys.ind$ i
 where i.obj# = o.obj#
 and i.type# in (1, 2, 3, 4, 6, 7, 9))))
 and o.name = 'COT_NTN_PI_V';
Philᵀᴹ
fonte