是的,我知道DatabaseMetadata.getIndexInfo,但它似乎做不到我想做的事情。
我有两个用户/模式,我们称它们为A和B。
A中有一张名为TAB的表。用户B在A.TAB上创建了一个索引,让我们调用索引IND。
我想要的信息是:模式TAB中的表A (即带有所有者A的a.k.a)上有哪些索引。我不关心指数的所有者,只关心它们在特定的表上。
通过对getIndexInfo的实验,我发现了以下几点:
第一个参数catalog似乎被Oracle驱动程序完全忽略了。第二个参数schema限制返回哪个表统计信息,和approximate的所有者和(粗略地)他们应该做的事情(除了给出<>d24将实际执行一个update统计语句)。
跟踪了JDBC驱动程序在getIndexInfo(null, "A", "TAB", false, true)上执行的SQL之后,我得到了以下结果:
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。这意味着此查询将只返回与表相同的用户所拥有的索引信息。
我可以想出三种可能的解决办法:
schema设置为null。如果两个模式包含相同的表名(因为无法确定给定模式在哪个表(即哪个表所有者)上),这就会变得很糟糕。executeQuery())。我宁愿不降到这个水平,除非它是绝对的unavoidable.这些解决方案在我看来都不是特别令人高兴的,但如果没有其他的解决办法,我可能不得不回到直接SQL执行。
数据库和JDBC驱动程序都位于11.2.0.2.0。
所以基本上我的问题是:
发布于 2011-09-01 06:09:18
我建议您直接查询Oracle字典表,但首先:
select * from dba_indexes使用该视图,获取所需信息几乎是微不足道的。
但是,访问dba_表和视图需要用户拥有特殊权限,但是由于您不希望给每个人DBA特权,所以您可以只需:
grant select any dictionary to username连接为系统或系统,以便选定的用户可以查询字典。
为了防止您想要查看Oracle的字典,请尝试:
select * from dict诚挚的问候。
发布于 2011-09-01 06:51:48
总是在同一个模式中创建索引和表(即让它们拥有相同的所有者)。不幸的是,这并不总是一种选择。
这将是我最喜欢的做法。
架构设置为null的
查询。如果两个模式包含相同的表名(因为无法确定给定模式在哪个表(即哪个表所有者)上),这种情况就会变得很糟糕。
当然,您可以找到它,因为getIndexInfo()返回的结果集确实包含每个表的正确模式。但是您无法找出索引在哪个架构中。
直接执行该SQL。
实际上,我将使用该查询的修改版本,该版本还将返回每个索引的模式,以简化索引的标识。
但是,同样:我还将在相同的模式中创建索引和表。
https://stackoverflow.com/questions/7158565
复制相似问题