web-dev-qa-db-fra.com

Comment trouver un objet qui ne semble pas exister dans la table des objets?

J'ai un objet appelé cot_ntn_pi_v. On m'a dit que c'était un synonyme. Il n'apparaît pas dans la table all_synonym. Cela ressemble à une vue ou une table mais je ne la trouve pas dans la table tous les objets. Je peux le sélectionner, mais je ne peux pas le supprimer car il "n'existe pas" et je ne peux pas créer une nouvelle table avec le même nom que "le nom est déjà utilisé par un autre objet".

Suis-je en train de devenir fou ou de faire quelque chose de vraiment stupide?

11
BON

Les types d'objets dans le même espace de noms qu'une table sont:

  • Procédures autonomes
  • Fonctions stockées autonomes
  • Paquets
  • Types définis par l'utilisateur
  • Les séquences
  • Vues
  • Synonymes privés
  • Vues matérialisées

C'est donc probablement l'un de ces types. Si vous pouvez le sélectionner, il exclut les cinq premiers, en le laissant soit une table, une vue, un synonyme privé ou une vue matérialisée.

Lorsque vous avez recherché dans all_objects etc. vous avez utilisé des majuscules? Par exemple,

select *
  from ALL_OBJECTS
 where OBJECT_NAME = 'COT_NTN_PI_V'; 

Si vous utilisez un outil comme SQL Developer ou Toad, vous pouvez le laisser décrire l'objet pour vous. Mettez en surbrillance le nom dans l'outil et appuyez sur Shift-F4 dans Developer ou F4 dans Toad. Toad fournit beaucoup de description sur l'objet tandis que Developer, dans l'onglet Détails, aura une ligne avec TABLE_NAME ou MVIEW_NAME dedans et ça vous montrera ce que c'est.

Une fois que vous savez ce que c'est, il sera plus facile de savoir comment le déposer.

11
John Doyle

Vous ne pourrez peut-être pas voir l'objet dans les tables ALL_% si vous ne disposez d'aucune autorisation sur l'objet lui-même, alors vérifiez dans la table DBA_OBJECTS (vous aurez besoin d'autorisations/d'un utilisateur dûment autorisé pour ce faire):

select * 
from DBA_OBJECTS
where object_name = 'COT_NTN_PI_V';

Si cela ne produit aucune sortie, vous pouvez archiver les tables du dictionnaire de données Oracle brutes avec cette requête:

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';
4
Philᵀᴹ