Jak znaleźć obiekt, który wydaje się nie istnieć w tabeli obiektów?

11

Mam obiekt o nazwie cot_ntn_pi_v. Powiedziano mi, że to synonim. Nie pojawia się w tabeli all_synonimy. Wygląda jak widok lub tabela, ale nie mogę go znaleźć w tabeli wszystkich obiektów. Mogę wybrać z niego, ale nie mogę go upuścić, ponieważ „nie istnieje” i nie mogę utworzyć nowej tabeli o tej samej nazwie, co „nazwa jest już używana przez inny obiekt”.

Czy wariuję czy robię coś naprawdę głupiego?

BON
źródło
1
Jeśli nie masz uprawnień do elementu, może nie być wyświetlany w tabelach ALL_ *. Może być konieczne zalogowanie się do administratora i sprawdzenie tabel słownika danych DBA_ *.
ConcernedOfTunbridgeWells

Odpowiedzi:

11

Typy obiektów w tej samej przestrzeni nazw co tabela to:

  • Samodzielne procedury
  • Autonomiczne przechowywane funkcje
  • Pakiety
  • Typy zdefiniowane przez użytkownika
  • Sekwencje
  • Wyświetlenia
  • Prywatne synonimy
  • Widoki zmaterializowane

Dlatego jest to prawdopodobnie jeden z tych typów. Jeśli możesz z niego wybrać, wyklucza to pierwsze pięć, pozostawiając go jako tabelę, widok, prywatny synonim lub widok zmaterializowany.

Podczas wyszukiwania all_objectsitp. Używałeś wielkich liter? Na przykład,

select *
  from ALL_OBJECTS
 where OBJECT_NAME = 'COT_NTN_PI_V'; 

Jeśli używasz jakiegoś narzędzia, takiego jak SQL Developer lub Toad, możesz pozwolić, aby opisał obiekt dla Ciebie. Podświetl nazwę w narzędziu i naciśnij przycisk Shift-F4Deweloper lub F4Ropucha. Toad zawiera dużo opisu obiektu, podczas gdy Deweloper na karcie Szczegóły będzie miał wiersz z TABLE_NAMElub MVIEW_NAMEw nim i pokaże ci, co to jest.

Gdy już wiesz, co to jest, łatwiej będzie wiedzieć, jak go upuścić.

John Doyle
źródło
Tak, używając dewelopera sql i shift + f4, udało mi się dowiedzieć, czego potrzebuję! Dzięki :)
BON
4

Obiekt może nie być w stanie zobaczyć obiektu w tabelach ALL_%, jeśli nie masz żadnych uprawnień dla samego obiektu, więc sprawdź w tabeli DBA_OBJECTS (aby to zrobić, potrzebujesz uprawnień / odpowiednio przyznanego użytkownika):

select * 
from DBA_OBJECTS
where object_name = 'COT_NTN_PI_V';

Jeśli to nie da żadnych wyników, możesz sprawdzić w surowych tabelach słownika danych Oracle za pomocą tego zapytania:

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ᵀᴹ
źródło