Как найти объект, который, кажется, не существует в таблице объектов?

11

У меня есть объект под названием cot_ntn_pi_v. Мне сказали, что это синоним. Он не отображается в таблице all_synonyms. Это выглядит как представление или таблица, но я не могу найти его в таблице всех объектов. Я могу выбрать из него, но я не могу удалить его, так как он «не существует», и я не могу создать новую таблицу с таким же именем, как «имя уже используется другим объектом».

Я схожу с ума или делаю что-то действительно глупое?

BON
источник
1
Если у вас нет прав доступа к элементу, он может не отображаться в таблицах ALL_ *. Вам может потребоваться административный вход в систему и просмотреть таблицы словаря данных DBA_ *.
ConcernedOfTunbridgeWells

Ответы:

11

Типы объектов в том же пространстве имен, что и таблица:

  • Автономные процедуры
  • Автономные сохраненные функции
  • пакеты
  • Пользовательские типы
  • Последовательности
  • Просмотры
  • Частные синонимы
  • Материализованные представления

Поэтому это, вероятно, один из тех типов. Если вы можете выбрать из него, тогда он исключает первые пять, оставляя его в виде таблицы, представления, частного синонима или материализованного представления.

Когда вы искали all_objectsи т.д., вы использовали верхний регистр? Например,

select *
  from ALL_OBJECTS
 where OBJECT_NAME = 'COT_NTN_PI_V'; 

Если вы используете какой-либо инструмент, такой как SQL Developer или Toad, вы можете позволить ему описать объект для вас. Выделите имя в инструменте и нажмите « Shift-F4Разработчик» или « F4Жаба». Жаба дает много описания объекта, в то время как Developer, на вкладке Details, будет иметь строку с ним TABLE_NAMEили MVIEW_NAMEвнутри него, и это покажет вам, что это такое.

Как только вы узнаете, что это такое, вам будет легче узнать, как это бросить.

Джон Дойл
источник
Да, используя sql developer и shift + f4, я смог узнать, что мне нужно! Спасибо :)
BON
4

Вы, возможно, не сможете увидеть объект в таблицах ALL_%, если у вас нет каких-либо прав доступа к самому объекту, поэтому проверьте в таблице DBA_OBJECTS (для этого вам понадобятся права доступа / соответствующим образом предоставленный пользователь):

select * 
from DBA_OBJECTS
where object_name = 'COT_NTN_PI_V';

Если это не дает никакого результата, вы можете проверить в таблицах словаря необработанных данных Oracle следующий запрос:

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ᵀᴹ
источник