Ich möchte die Fremdschlüssel einer Tabelle finden, aber es kann mehr als einen Benutzer/ein Schema mit einer Tabelle mit dem gleichen Namen geben. Wie kann ich denjenigen finden, den der aktuell angemeldete Benutzer sieht? Gibt es eine Funktion, die ihren Besitzer gibt? Was ist, wenn es öffentliche Synonyme gibt?Wie kann ich den OWNER eines Objekts in Oracle finden?
Antwort
Sie die ALL_OBJECTS abfragen kann sehen:
select owner
, object_name
, object_type
from ALL_OBJECTS
where object_name = 'FOO'
um Synonyme zu finden:
select *
from ALL_SYNONYMS
where synonym_name = 'FOO'
Nur um zu klären, ob ein
Benutzer
SQL-Anweisung des Benutzers verweist auf einen Objektnamen ohne Schema Qualifikation (B. "FOO"), überprüft Oracle FIRST das Schema des Benutzers für ein Objekt dieses Namens (einschließlich Synonyme in dem Schema dieses Benutzers). Wenn Oracle den Verweis vom Benutzerschema nicht auflösen kann, sucht Oracle nach einem öffentlichen Synonym.
Wenn Sie suchen, die speziell für Einschränkungen auf einem bestimmten table_name:
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
- Nachtrag:
Wenn Benutzer Zugriff auf die DBA_ Ansichten gewährt (zB wenn Ihr Benutzer wurde SELECT_CATALOG_ROLE erteilt), Sie können "DBA_
" anstelle von "ALL_
" in den vorhergehenden SQL-Beispielen ersetzen. In den Ansichten ALL_x
werden nur Objekte angezeigt, denen Sie Berechtigungen erteilt haben. In den Ansichten DBA_x
werden alle Datenbankobjekte angezeigt, unabhängig davon, ob Sie über Berechtigungen verfügen oder nicht.
Interessante Frage - ich glaube nicht, dass es jede Oracle-Funktion, die dies tut (fast wie ein „die“ Befehl in Unix), aber man kann durch die Auflösung, um für den Namen zu bekommen:
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')
Verwenden Sie die Funktion USER
, um den Namen des aktuellen Benutzers in einer Oracle-Sitzung zu finden.
Beachten Sie, dass der Eigentümer der Einschränkung, der Besitzer der Tabelle, die den Fremdschlüssel enthält, und der Besitzer der referenzierten Tabelle alle unterschiedlich sein können. Es klingt wie es ’ der Tabelleneigentümer s Sie ’ re interessiert an, in diesem Fall sollte dies zu schließen, was Sie wollen:
select Constraint_Name
from All_Constraints
where Table_Name = 'WHICHEVER_TABLE'
and Constraint_Type = 'R' and Owner = User;
Oracle Ansichten wie ALL_TABLES und ALL_CONSTRAINTS einen Besitzer Spalte haben, die Sie verwenden können Beschränken Sie Ihre Abfrage. Es gibt auch Varianten dieser Tabellen, die mit USER anstelle von ALL beginnen, die nur Objekte auflisten, auf die der aktuelle Benutzer zugreifen kann.
Eine der Ansichten sollte helfen, Ihr Problem zu lösen. Für ähnliche Probleme haben sie immer gut funktioniert.
Ich fand diese Frage als das oberste Ergebnis beim Googeln, wie man den Besitzer einer Tabelle in Oracle findet, also dachte ich, dass ich eine tabellenspezifische Antwort für die Bequemlichkeit anderer beitragen würde.
Um den Vermieter zu einer bestimmten Tabelle in einer Oracle-DB, verwenden Sie die folgende Abfrage zu finden:
select owner from ALL_TABLES where TABLE_NAME ='<MY-TABLE-NAME>';
- 1. Wie kann ich den Modellnamen eines Objekts in Schienen erhalten?
- 2. Wie kann ich den Inhalt eines RealmResults-Objekts mischen
- 3. Wie finden Sie den PHID eines Phabricator-Objekts?
- 4. Wie kann ich den Index eines Artikels in Swift finden?
- 5. Ich kann den Namen eines dynamisch erstellten Javascript-Objekts (in jQuery) nicht finden
- 6. Oracle: Wie ermittele ich den NEUEN Namen eines Objekts in einem "AFTER ALTER" Trigger?
- 7. Kann Reflexion den Zustand eines Objekts ändern?
- 8. Wie setze ich den Rand eines Objekts in IE?
- 9. Den letzten Index eines Strings in Oracle finden
- 10. Wie kann man den aktuellen Oracle-Patchsatz programmatisch finden?
- 11. Wie kann ich alle öffentlichen Felder eines Objekts in C# finden?
- 12. Wie kann ich die Prototypkette eines JavaScript-Objekts sehen?
- 13. Wie den Schlüssel eines Objekts verwenden
- 14. Wie animiere ich den Eingang eines RecyclerView-Objekts?
- 15. Wie kann ich das Zentrum des Objekts finden?
- 16. AngularJS: Wie bekomme ich den Schlüssel eines JSON-Objekts?
- 17. Wie rufen Sie den Typ eines Objekts in Swift ab?
- 18. genehmigen den Klassentyp eines Objekts in Schienen
- 19. Dumping den Speicherinhalt eines Objekts
- 20. Wie kann ich den Wert eines Parameters innerhalb eines Objekts festlegen?
- 21. Wie erhalte ich den Wert eines Fremdschlüssels statt des Objekts?
- 22. Wie kann ich den Wert eines Elements eines Objekts namens pages.total ändern? PHP
- 23. .NET: Wie erhalten Sie den Typ eines Null-Objekts?
- 24. Wie kann ich die Ablaufdatumszeit eines HttpRuntime.Cache-Objekts abrufen?
- 25. Wie überschreibe ich die Standardausgabe eines Objekts?
- 26. Wie bestimmt DevTools den Namen eines Konstruktors eines Objekts?
- 27. Paraview: Berechne den Oberflächenbereich eines 3D-Objekts
- 28. Wie bekomme ich den Typ eines Objekts, damit ich es mit instanceof verwenden kann?
- 29. Wie kann ich den aktuellen Wert eines Objekts in einer anderen Datei abrufen?
- 30. Wie kann ich den Eigenschaftswert eines Objekts dynamisch in JavaScript abrufen?
Nur die Abfrage ein wenig flexibler zu machen, würde ich würde fragen 'wo niedriger (object_name) = ' foo'' Dies ist besonders hilfreich, wenn Sie einen Funktionsnamen haben, aber nicht (beispielsweise wie von einem Anruf in einem externen Programm, das Groß- und Kleinschreibung ist, wie es der Fall für mich war) Gehäuse. – Travis
@Travis: das würde die Abfrage flexibler machen. Um zu sehen, wie Oracle "case insensitive" Bezeichner in einer SQL-Anweisung sieht, wollen wir ** 'WHERE object_name = UPPER ('foo')' **. (Eine Kennung, die in einer SQL-Anweisung in doppelten Anführungszeichen nicht eingeschlossen ist durch Oracle betrachtet, als ob sie in der oberen Fall waren (Oracle Identifikatoren * ist * Groß- und Kleinschreibung;. Wir müssen sie nur in Anführungszeichen in einer SQL-Anweisung kleingeschrieben zu erhalten Wenn wir 'SELECT * FROM foo 'wählen, sieht Oracle den Bezeichner tatsächlich als' FOO', als ob wir 'SELECT * FROM FOO' gemacht hätten.) – spencer7593