2009-06-03 8 views
16

Je veux trouver les clés étrangères d'une table mais il peut y avoir plus d'un utilisateur/schéma avec une table avec le même nom. Comment puis-je trouver celui que l'utilisateur actuellement connecté voit? Y a-t-il une fonction qui donne à son propriétaire? Et s'il y a des synonymes publics?Comment puis-je trouver le propriétaire d'un objet dans Oracle?

Répondre

30

Vous pouvez interroger les ALL_OBJECTS Vue:

select owner 
    , object_name 
    , object_type 
    from ALL_OBJECTS 
where object_name = 'FOO' 

Pour trouver des synonymes:

select * 
    from ALL_SYNONYMS 
where synonym_name = 'FOO' 

Juste pour clarifier, si une instruction SQL de l'utilisateur utilisateur fait référence à un nom d'objet sans qualification de schéma (par exemple 'FOO'), Oracle FIRST vérifie le schéma de l'utilisateur pour un objet de ce nom (y compris les synonymes dans le schéma de cet utilisateur). Si Oracle ne parvient pas à résoudre la référence à partir du schéma de l'utilisateur, Oracle recherche ensuite un synonyme public.

Si vous êtes à la recherche spécifiquement pour les contraintes sur un nom_table particulier:

select c.* 
    from all_constraints c 
where c.table_name = 'FOO' 
union all 
select cs.* 
    from all_constraints cs 
    join all_synonyms s 
    on (s.table_name = cs.table_name 
    and s.table_owner = cs.owner 
    and s.synonym_name = 'FOO' 
     ) 

HTH

- Additif:

Si votre utilisateur a accès aux vues DBA_ (par exemple si votre utilisateur a été accordé SELECT_CATALOG_ROLE), vous pouvez remplacer 'DBA_' à la place de 'ALL_' dans les exemples SQL précédents. Les vues ALL_x affichent uniquement les objets pour lesquels vous avez reçu des privilèges. Les vues DBA_x affichent tous les objets de base de données, que vous ayez ou non des privilèges.

+0

Juste pour faire la requête un peu plus souple, je voudrais interroger'Où inférieur (object_name) = ' foo'' Ceci est particulièrement utile lorsque vous avez un nom de fonction, mais pas de casing (par exemple, comme un appel d'un programme externe qui ne tient pas compte de la casse, comme c'était le cas pour moi-même). – Travis

+0

@Travis: cela rendrait la requête plus flexible. Pour mieux correspondre à la manière dont Oracle voit les identificateurs "insensibles à la casse" dans une instruction SQL, nous voulons que ** 'WHERE object_name = UPPER ('foo')' **. (Un identificateur qui n'est pas entre guillemets dans une instruction SQL est considéré par Oracle comme s'il était en majuscule. (Les identificateurs Oracle * sont * sensibles à la casse, il suffit de les placer entre guillemets dans une instruction SQL pour conserver les minuscules Lorsque nous faisons 'SELECT * FROM foo', Oracle voit réellement l'identificateur comme' FOO', comme si nous avions fait 'SELECT * FROM FOO'. – spencer7593

2

Question intéressante - Je ne pense pas qu'il y ait une fonction Oracle qui fait cela (presque comme une commande « qui » sous Unix), mais vous pouvez obtenir l'ordre de résolution du nom pour:

select * from 
(
select object_name objname, object_type, 'my object' details, 1 resolveOrder 
    from user_objects 
    where object_type not like 'SYNONYM' 
union all 
select synonym_name obj , 'my synonym', table_owner||'.'||table_name, 2 resolveOrder 
    from user_synonyms 
union all 
select synonym_name obj , 'public synonym', table_owner||'.'||table_name, 3 resolveOrder 
    from all_synonyms where owner = 'PUBLIC' 
) 
where objname like upper('&objOfInterest') 
1

Pour rechercher le nom de l'utilisateur actuel dans une session Oracle, utilisez la fonction USER.

Notez que le propriétaire de la contrainte, le propriétaire de la table contenant la clé étrangère et le propriétaire de la table référencée peuvent tous être différents. On dirait que ce ’ est le propriétaire de la table vous ’ re intéressé, dans ce cas, cela devrait être proche de ce que vous voulez:

select Constraint_Name 
from All_Constraints 
where Table_Name = 'WHICHEVER_TABLE' 
    and Constraint_Type = 'R' and Owner = User; 
1

vues Oracle comme ALL_TABLES et all_constraints ont une colonne propriétaire, que vous pouvez utiliser pour restreindre votre requête. Il existe également des variantes de ces tables commençant par USER au lieu de ALL, qui liste uniquement les objets auxquels l'utilisateur actuel peut accéder.

L'un des points de vue these devrait vous aider à résoudre votre problème. Ils ont toujours bien fonctionné pour moi pour des problèmes similaires.

0

J'ai trouvé cette question comme le meilleur résultat en recherchant comment trouver le propriétaire d'une table dans Oracle, donc j'ai pensé que je contribuerais une réponse spécifique à la table pour la commodité des autres.

Pour trouver le propriétaire d'une table spécifique dans une base de données Oracle, utilisez la requête suivante:

select owner from ALL_TABLES where TABLE_NAME ='<MY-TABLE-NAME>'; 
Questions connexes