2009-06-03 13 views
16

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

30

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.

+0

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

+0

@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

2

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') 
1

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; 
1

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.

0

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>'; 
Verwandte Themen