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
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.
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')
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;
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.
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>';
- 1. Comment trouver les curseurs ouverts courants dans Oracle
- 2. Comment obtenir le propriétaire précédent dans la table sql?
- 3. Comment trouver le champ clé pour un objet NHibernate
- 4. Oracle BPM Ajax to Fuego Objet
- 5. Comment lire le journal des transactions Oracle
- 6. Comment obtenir le nom d'utilisateur ou le propriétaire d'un processus dans .net
- 7. trouver un objet en Javascript
- 8. Qu'est-ce qui décrit le mieux le "propriétaire du fichier" dans l'objectif-c/cacao Nib?
- 9. Comment modifier le propriétaire d'une base de données SQL Server?
- 10. grille dessinée par le propriétaire - .NET
- 11. NHibernate - n'a pas pu trouver (oracle) dialecte dans la configuration
- 12. Restaurer le focus de la fenêtre sur le précédent propriétaire
- 13. SQL Rights Creator/Propriétaire
- 14. Trouver l'adresse IP d'un objet distant dans .net remoting
- 15. Comment trouver tous les champs publics d'un objet en C#?
- 16. Comment trouver et mettre à jour le journal des alertes Oracle
- 17. Comment trouver l'adresse mémoire d'un objet modèle Python/Django?
- 18. Oracle parallel query - Comment trouver le nombre réel de processus engendrés?
- 19. WPF Get UserControl propriétaire
- 20. Trouver des champs vides dans un objet - C#
- 21. Comment trouver des lignes dans le tableau SQL où xPath
- 22. Trouver un objet dans une liste générique avec méthode Find
- 23. Comment trouver le nombre d'utilisateurs, le nombre d'utilisateurs avec un objet de profil, et les connexions mensuelles dans Django
- 24. Configurer Oracle Text pour indexer les valeurs de plusieurs colonnes dans les tables Oracle
- 25. Comment définir un enfant MDI comme propriétaire d'un autre formulaire?
- 26. Comment obtenir une image stockée en tant qu'obob oracle dans un objet Image
- 27. Comment définir le propriétaire du fichier sur Utilisateur connecté dans SAP ABAP?
- 28. Subsonic - Comment utiliser SQL Schema/Nom du propriétaire dans le cadre de l'espace de noms?
- 29. Comment puis-je connecter le "propriétaire du fichier" avec un bouton dans une barre d'outils?
- 30. Comment obtenir le dernier objet dans une liste générique?
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
@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