2

はい、私は知っDatabaseMetadata.getIndexInfoいますが、それは私が望むことをしていないようです。

A2つのユーザー/スキーマがあります。それらをとと呼びましょうB

Aと呼ばれるテーブルがありますTAB。ユーザーBがにインデックスを作成しました。A.TABそのインデックスを呼び出しましょうIND

私が必要とする情報は次のとおりです。TABスキーマのテーブルにあるインデックスA(別名、所有者A)。インデックスの所有者は気にせず、特定のテーブルにあるだけです。

実験してみるとgetIndexInfo、次のことがわかりました。

  • 最初の引数catalogは、OracleJDBCドライバーによって完全に無視されているようです。
  • 2番目の引数は、返されるテーブル統計とインデックスの所有者をschema制限します
  • uniqueそしてapproximate(大まかに)彼らがすべきことをします(与えることapproximate=falseは実際に更新統計ステートメントを実行することを除いて)。

JDBCドライバーが実行するSQLをトレースするとgetIndexInfo(null, "A", "TAB", false, true)、次のようになります。

select null as table_cat,
       owner as table_schem,
       table_name,
       0 as NON_UNIQUE,
       null as index_qualifier,
       null as index_name, 0 as type,
       0 as ordinal_position, null as column_name,
       null as asc_or_desc,
       num_rows as cardinality,
       blocks as pages,
       null as filter_condition
from all_tables
where table_name = 'TAB'
  and owner = 'A'
union
select null as table_cat,
       i.owner as table_schem,
       i.table_name,
       decode (i.uniqueness, 'UNIQUE', 0, 1),
       null as index_qualifier,
       i.index_name,
       1 as type,
       c.column_position as ordinal_position,
       c.column_name,
       null as asc_or_desc,
       i.distinct_keys as cardinality,
       i.leaf_blocks as pages,
       null as filter_condition
from all_indexes i, all_ind_columns c
where i.table_name = 'TAB'
  and i.owner = 'A'
  and i.index_name = c.index_name
  and i.table_owner = c.table_owner
  and i.table_name = c.table_name
  and i.owner = c.index_owner
order by non_unique, type, index_name, ordinal_position

あなたが両方 を見ることができるように、table_name そして i.ownerあることに制限されていTABます。これは、このクエリがテーブルと同じユーザーが所有するインデックス情報のみを返すことを意味します。

私は3つの可能な回避策を考えることができます:

  1. 常に同じスキーマにインデックスとテーブルを作成します(つまり、同じ所有者を持たせます)。残念ながら、それは常にオプションではありません。
  2. schemaに設定してクエリを実行しnullます。これは、2つのスキーマに同じテーブル名が含まれるとすぐに醜くなります(特定のスキーマがどのテーブル(つまり、どのテーブル所有者)にあるかを知る方法がないため)。
  3. そのSQLを直接実行します(を使用してexecuteQuery())。どうしてもやむを得ない場合を除いて、このレベルに落ちたくない。

これらの回避策はどれも私には特に喜ばしいものではありませんが、他に何も機能しない場合は、SQLの直接実行にフォールバックする必要があるかもしれません。

データベースとJDBCドライバーの両方が11.2.0.2.0にあります。

つまり、基本的に私の質問は次のとおりです。

  1. これはJDBCドライバーのバグですか、それとも私が気付いていないロジックが背後にありますか?
  2. Oracleに必要な情報を提供してもらうための、シンプルで合理的に移植可能な方法はありますか?
4

2 に答える 2

1

Oracleディクショナリテーブルを直接クエリすることをお勧めしますが、次から始めます。

select * from dba_indexes

そのビューを使用すると、必要な情報を取得するのはほとんど簡単です。

ただし、dba_ テーブルとビューにアクセスするには、ユーザーに特別な権限が必要ですが、全員に DBA 権限を与えたくない場合は、次のようにします。

grant select any dictionary to username

選択したユーザーが辞書を照会できるように、system または sys として接続されます。

Oracle の辞書を調べたい場合に備えて、次のことを試してください。

select * from dict

よろしくお願いします。

于 2011-09-01T06:09:18.700 に答える
1

常に同じスキーマにインデックスとテーブルを作成します (つまり、同じ所有者を持つようにします)。残念ながら、それは常にオプションではありません。

それが私の好ましい方法です。

スキーマが null に設定されたクエリ。これは、2 つのスキーマに同じテーブル名が含まれているとすぐに見苦しくなります (特定のスキーマがどのテーブル (つまり、どのテーブル所有者) にあるかを知る方法がないため)。

もちろん、 getIndexInfo() によって返される結果セットには各テーブルの正しいスキーマが含まれているため、それを見つけることができます。しかし、インデックスがどのスキーマにあるかを見つけることはできません。

その SQL を直接実行する

実際には、インデックスの識別を軽減するために、各インデックスのスキーマも返す、そのクエリの修正版を使用します。

繰り返しになりますが、インデックスとテーブルも同じスキーマに作成します。

于 2011-09-01T06:51:48.357 に答える