首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何通过JDBC在Oracle中的表中获取所有索引,即使它们是由不同用户拥有的?

如何通过JDBC在Oracle中的表中获取所有索引,即使它们是由不同用户拥有的?
EN

Stack Overflow用户
提问于 2011-08-23 09:04:58
回答 2查看 2.3K关注 0票数 2

是的,我知道DatabaseMetadata.getIndexInfo,但它似乎做不到我想做的事情。

我有两个用户/模式,我们称它们为AB

A中有一张名为TAB的表。用户BA.TAB上创建了一个索引,让我们调用索引IND

我想要的信息是:模式TAB中的表A (即带有所有者A的a.k.a)上有哪些索引。我不关心指数的所有者,只关心它们在特定的表上。

通过对getIndexInfo的实验,我发现了以下几点:

第一个参数catalog似乎被Oracle驱动程序完全忽略了。第二个参数schema限制返回哪个表统计信息,和approximate的所有者(粗略地)他们应该做的事情(除了给出<>d24将实际执行一个update统计语句)。

跟踪了JDBC驱动程序在getIndexInfo(null, "A", "TAB", false, true)上执行的SQL之后,我得到了以下结果:

代码语言:javascript
复制
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。这意味着此查询将只返回与表相同的用户所拥有的索引信息。

我可以想出三种可能的解决办法:

  1. 总是在相同的模式中创建索引和表(即让它们拥有相同的所有者)。不幸的是,这并不总是一个option.
  2. Query,schema设置为null。如果两个模式包含相同的表名(因为无法确定给定模式在哪个表(即哪个表所有者)上),这就会变得很糟糕。
  3. 直接执行该SQL (使用executeQuery())。我宁愿不降到这个水平,除非它是绝对的unavoidable.

这些解决方案在我看来都不是特别令人高兴的,但如果没有其他的解决办法,我可能不得不回到直接SQL执行。

数据库和JDBC驱动程序都位于11.2.0.2.0。

所以基本上我的问题是:

  1. 是JDBC驱动程序中的一个bug,还是它背后有一些我不知道的逻辑?
  2. 是否有一种简单和合理的可移植方式来让甲骨文提供我所需要的信息?
EN

回答 2

Stack Overflow用户

发布于 2011-09-01 06:09:18

我建议您直接查询Oracle字典表,但首先:

代码语言:javascript
复制
select * from dba_indexes

使用该视图,获取所需信息几乎是微不足道的。

但是,访问dba_表和视图需要用户拥有特殊权限,但是由于您不希望给每个人DBA特权,所以您可以只需:

代码语言:javascript
复制
grant select any dictionary to username

连接为系统或系统,以便选定的用户可以查询字典。

为了防止您想要查看Oracle的字典,请尝试:

代码语言:javascript
复制
select * from dict

诚挚的问候。

票数 1
EN

Stack Overflow用户

发布于 2011-09-01 06:51:48

总是在同一个模式中创建索引和表(即让它们拥有相同的所有者)。不幸的是,这并不总是一种选择。

这将是我最喜欢的做法。

架构设置为null的

查询。如果两个模式包含相同的表名(因为无法确定给定模式在哪个表(即哪个表所有者)上),这种情况就会变得很糟糕。

当然,您可以找到它,因为getIndexInfo()返回的结果集确实包含每个表的正确模式。但是您无法找出索引在哪个架构中。

直接执行该SQL。

实际上,我将使用该查询的修改版本,该版本还将返回每个索引的模式,以简化索引的标识。

但是,同样:我还将在相同的模式中创建索引和表。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7158565

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档