1

環境は Oracle 9 & 10 です。DBA レベルのアクセス権はありません。

問題は、特定の列が別のスキーマの特定のテーブルに存在することを確認することです。

対処するケースは 2 つあります。

  1. 同じインスタンス内の別のスキーマ
  2. db_link を使用した別のインスタンスのスキーマ

私のスキーマFREDと別のスキーマBARNEYを考えて、私はこのようなことを試みました

SELECT 1
FROM BARNEY.USER_TAB_COLS
WHERE TABLE_NAME = 'SOME_TABLE' 
  AND COLUMN_NAME = 'SOME_SPECIFIC_COLUMN'

[1]: (エラー): ORA- 00942 : テーブルまたはビューが存在しません

これについてしばらく悩んだ後、USER_TAB_COLS は実際にはテーブルではないことに気付きました。ビューです。私はずっとテーブルから選択してきましたが、ビューからは選択していません。

db_link で同じことを試してみたところ、データが戻ってくるのを見て驚きました。db_link には schema_name/password が埋め込まれているため、他のスキーマに効果的にログインし、ビューに到達できるようになるため、機能したことは理にかなっているように思えます。

グーグルで検索し、オラクルのドキュメントの山で眼球をすり減らしたので、正しい方向に向けてくれる人、または少なくとも何が欠けているかを指摘してくれる人を探しています。

特定の列が存在することを検証するために、同じインスタンス内のスキーマからユーザー テーブル関連のメタデータを取得するために使用できる手法は何ですか?

前もって感謝します。

悪の。

良い答えには+1。ありがとうございました。

4

4 に答える 4

6

次のクエリを使用できます。

SELECT 1
FROM ALL_TAB_COLS
WHERE TABLE_NAME = 'SOME_TABLE' 
  AND COLUMN_NAME = 'SOME_SPECIFIC_COLUMN'
  AND OWNER = 'BARNEY';

(User_Tables と User_Tab_Cols は all_tables と all_tab_coumns の単なるビューで、それにwhere owner = <Current User>アタッチされています)

バーニーの some_table を表示できる場合 (つまり、少なくとも SELECT 権限が付与されている場合)、列がそこにあるかどうかがわかります。テーブルに対する権限がない場合、メタ情報を取得することはできません。

于 2009-10-29T22:46:04.293 に答える
2

他の返信と同様に、通常、このようなクエリには ALL_TAB_COLUMNS を使用します。ただし、SELECT があるテーブルの列のみが表示されます。そして、それはその列の選択です。そのテーブルに列レベルの権限が実装されている可能性は低いですが、テーブルは表示されても、特定の列は表示されない可能性があります。私たちのほとんどにとって、それは非常にまれです。

DBA_TAB_COLUMNS はすべての列を表示しますが、DBA によってスキーマに許可された列を選択する必要があります。(実際には、ALL_TAB_COLUMNS を使用するには許可が必要ですが、これはほとんどのショップで一般的です)。DBMS_METADATA PL/SQL 組み込みパッケージも使用できますが、同様の制限がありますが、より複雑になると思います。

もちろん、barney.some_table.some_column@my_dblink (または興味のある部分) からレコードを選択することもできます。そして、例外を処理します。醜い、私はほとんどの状況でそれをお勧めしません.

于 2009-10-30T13:57:14.493 に答える
1

同じインスタンス、異なるスキーマ:

Select Count(*)
From   all_tab_cols
Where  owner       = 'BARNEY'               and
       table_name  = 'SOME_TABLE'           and
       column_name = 'SOME_SPECIFIC_COLUMN';

count(*) には、値が 1 または 0 の単一行を常に返すという利点があるためNO_DATA_FOUND、PL/SQL でエラーを処理する必要はありません。

DB リンク全体で、接続するものと同じスキーマ:

Select Count(*)
From   user_tab_cols@MY_DB_LINK
Where  table_name  = 'SOME_TABLE'           and
       column_name = 'SOME_SPECIFIC_COLUMN';

DB リンク全体で、接続するものとは異なるスキーマ:

Select Count(*)
From   all_tab_cols@MY_DB_LINK
Where  owner       = 'BARNEY'               and
       table_name  = 'SOME_TABLE'           and
       column_name = 'SOME_SPECIFIC_COLUMN';
于 2009-10-30T09:17:40.230 に答える
1

そのために all_tab_columns を使用します。

ただし、許可されているものしか表示されないことに注意してください。

于 2009-10-29T22:22:49.830 に答える