2009-06-03 10 views
16

テーブルの外部キーを検索したいが、同じ名前のテーブルを持つ複数のユーザー/スキーマが存在する可能性があります。現在ログインしているユーザーが見ているものを見つけるにはどうすればよいですか?所有者に与える機能はありますか?パブリックシノニムがある場合はどうなりますか?OracleのオブジェクトのOWNERはどのようにして見つけることができますか?

答えて

30

あなたはALL_OBJECTSビュー問い合わせることができます:(

select * 
    from ALL_SYNONYMS 
where synonym_name = 'FOO' 

だけ明確にするために、 ユーザー ユーザーのSQL文はありません、スキーマの資格を持つオブジェクト名を参照する場合:同義語を見つけるには

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

を'FOO'など)、Oracle FIRSTはユーザーのスキーマでその名前のオブジェクト(そのユーザーのスキーマ内の同義語を含む)をチェックします。 Oracleがユーザーのスキーマから参照を解決できない場合、Oracleはパブリック・シノニムをチェックします。

あなたが特定の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

- 補遺:

ユーザーがDBA_ビューへのアクセスを許可された場合(例えば、あなたの場合ユーザーにSELECT_CATALOG_ROLEが付与されている場合)、前のSQLの例では 'ALL_'の代わりに 'DBA_'を使用できます。 ALL_xビューには、権限を与えられたオブジェクトのみが表示されます。 DBA_xビューには、特権を持っているかどうかにかかわらず、すべてのデータベースオブジェクトが表示されます。

+0

を、私は '下(object_nameと)照会しまうでしょう= ' foo''これは、関数名を持っているが、大文字と小文字が区別されていない(たとえば、自分自身のように、大文字と小文字を区別しない外部プログラムの呼び出しのような)場合に特に役に立ちます。 – Travis

+0

@Travis:クエリの柔軟性が向上します。 OracleがSQL文で "大文字と小文字を区別しない"識別子をどのように見せるかをより正確に一致させるには、** 'WHERE object_name = UPPER( 'foo')' **が必要です。 (SQL文の二重引用符で囲まれていない識別子は、大文字であるかのようにOracleによって表示されます(Oracle識別子*は大文字と小文字が区別されますので、小文字を維持するためにSQL文で二重引用符で囲む必要がありますSELECT * FROM foo'を実行すると、Oracleは実際に 'SELECT * FROM FOO'を行ったかのように識別子を' FOO'と見なします。 – spencer7593

2

興味深い質問 - 私は(ほとんどのUnixで「これ」コマンドのように)これを実行する任意のOracle機能がないと思うが、あなたがして名前の解決順序を取得することができます。

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

Oracleセッション内で現在のユーザーの名前を調べるには、USER関数を使用します。

制約の所有者、外部キーを含むテーブルの所有者、および参照先テーブルの所有者がすべて異なる可能性があることに注意してください。その場合には、これはあなたが望むものに近づける必要があり、中にそれが’のテーブルの所有者あなた’興味の再ように聞こえる:

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

はALL_TABLESとALL_CONSTRAINTSのようなOracleのビューは、あなたが使用することができ、所有者の列を、持っていますあなたの質問を制限する。 ALLの代わりにUSERで始まるこれらのテーブルのバリエーションもあり、現在のユーザーがアクセスできるオブジェクトのみをリストします。

theseのいずれかが問題を解決するのに役立つはずです。彼らは似たような問題でいつもうまく働いた。

0

オラクルでテーブルの所有者を見つける方法を探究している最中にこの質問が見つかったので、他のユーザーの便宜のためにテーブル固有の回答に貢献すると思いました。

次のクエリを使用、オラクルDBの特定のテーブルの所有者を検索するには:ちょうどクエリがもう少し柔軟にするために

select owner from ALL_TABLES where TABLE_NAME ='<MY-TABLE-NAME>'; 
関連する問題