Oracle SQL Developer - 无法查看表

53

我之前使用的是SQL Developer 1.1。最近我升级到了SQL Developer 3。在升级后,我发现我的某些连接不显示它们的表格。我可以对这些表进行select查询,并且数据会被显示出来。其他对象比如视图等都可以看到。我仍然可以使用旧版本,并且能够看到同样模式下所有表格的列表。但有些连接显示正常。

我无法找到相关信息。我尝试去掉筛选器,但没有效果。

有人遇到过这个问题吗?请帮帮忙。

17个回答

62

你寻找的表格可能在不同的模式中。有几种选择。你可以在连接下的树形结构中点击“其他用户”,或右键单击连接并选择“模式浏览器”,然后选择所需的模式。


如果您没有默认模式可以提供给用户,但是您只想查看所有存在的表和视图呢?或者至少查看账户可以访问的所有表/视图呢? - vapcguy
我不想在不同的模式下更改数据库。我想要更改的模式是没有显示表的那个。 - Philip Rego

34

从中选择“其他用户”,然后选择您的用户(schema),在此下面您将能够看到您的表和视图。

屏幕截图


4
我正在使用的帐户没有出现在这里。为什么会这样呢?它不是一个“其他”用户,而是我实际上登录的用户 - vapcguy
你说的“你的用户”是什么意思?有数百个用户,我都不会称他们为我的。 - Philip Rego
在我的情况下,有一张表不在列表中。我可以查询它,但是"DESCRIBE"命令会返回一个错误。我怀疑我有查询的权限,但没有查看属性的权限。 - Slava Murygin

28

@vapcguy - 很抱歉听到这个消息。恐怕我无法提供太多帮助,因为我没有合适的环境。 - Thayz
@Thayz 谢谢!这可能是我读过的最有用的答案之一 - 你实际上提供了一种让它按照我的期望工作的方法 - 而不是Oracle认为更好的方式。他们应该将其设置为默认视图,并提供关闭它的功能! - kiltannen
版本19中没有“包含同义词”。 - Philip Rego

10

我在sqlDeveloper64-3.0.4.34和sqlDeveloper64-3.1.07.42中遇到了同样的问题。

根据https://forums.oracle.com/forums/thread.jspa?threadID=2202388的说法,JDBC驱动程序存在一个关于“Out Of Band Breaks”的bug - 基本上是一个低级别的TCP问题。

解决方法是使用JVM属性-Doracle.net.disableOob=true启动sql developer。我尝试了这个解决方案对3.0和3.1都有效。

因此,我在这里引用来自论坛的解决方案:


我认为我已经找到了一些用户出现问题而其他用户没有问题的原因。这似乎与JDBC驱动程序中的“Out Of Band Breaks”有关,基本上是一个低级别的TCP问题。这个错误似乎以多种方式表现。到目前为止,我已经确定使用共享连接(特别是在Vista或Windows 7上)和通过VPN连接(任何操作系统)是常见情况。在所有情况下,没有DBA访问权限也是一个问题。
首先,让我解释一下为什么DBA访问权限会产生差异。当我们首次访问任何特定的数据字典视图时,我们首先尝试查看是否可以访问该视图的DBA版本(在某些情况下是tab$等)。这些视图比普通的USER版本更有效,所以如果可以的话,我们想要使用它们。我们每个会话只检查每个DBA视图一次(仅在需要时),但我们可能需要检查访问一堆视图。
当我们进行此检查时,OOB错误似乎会出现。我们应该从数据库中获得一个漂亮且简单的响应。然而,在出现错误的场景中,这个低级别网络错误会导致发生错误,使连接变得不可用。这随后导致所有的连接关闭错误。看起来有一个解决方法 - JDBC驱动程序支持禁用OOB。但是,这样做将影响取消执行语句的能力,所以我不建议通常使用解决方法,但它应该解决用户遇到这个特定问题的情况。
要启用解决方法,需要设置Java系统属性 - oracle .net.disableOob = true 。您可以通过两种方式设置此属性。第一种方法是在命令行上传递sqldeveloper-strong-J-Doracle.net.disableOob = true。当然,这只适用于您通常从命令行运行时。您还可以添加一行到sqldeveloper.conf文件(位于+sqldeveloper \ bin +下)。在这里,行将是 AddVMOption -Doracle.net.disableOob = true 我们正在研究其他解决方案,但目前的解决方法应该让您能够使用SQL Developer。

修复了我的问题,但这个 bug 似乎突然出现了,一天一切正常,第二天就没有表格了。感谢您的发布!(我使用的是 3.2 版本) - chrismarx
问题解决了!谢谢! 在Ubuntu 10.10下使用sqlDeveloper版本3.0.04。 - ramaralo
我们的SOE出了一些问题,这个可以解决它。我已经不止一次通过谷歌重新找到这个答案了! - Coxy
我正在使用版本19,但问题仍未得到解决。显然他们不够重视这个问题。 - Philip Rego

8
关于进入“其他用户”的回答接近了问题的答案,但并不够明确,所以我感到有必要添加下面的答案。
在Oracle中,它只会显示属于由您登陆的账户拥有的模式(在MS SQL Server中为数据库)的表格。如果该账户没有拥有或创建任何表格,即使您对数据库中的所有内容都有权限,也将看不到任何东西!(这与MS SQL Server Management Studio相反,在那里您可以看到您拥有权限且所有权人始终为“dbo”的任何东西,除非某个管理员出于某些无法预见的原因更改了它。)
所有权人将是唯一一个在树形结构下的“表格”中看到这些表格的人。如果您不是其所有者而看不到它们,您将不得不进入“其他用户”并展开每个用户,直到找到创建/拥有该模式的用户,如果您不知道它,已经存在。无论您的帐户是否具有访问表格的权限,您仍然必须进入“其他用户”并找到拥有它的用户,才能在“表格”下找到它!
有一件事可以帮助您:当您编写查询时,您应该实际上指定命名规则是谁的所有者,例如。
Select * from admin.mytable

这个意思是“admin”是拥有它的用户,所以您需要进入“其他用户 > Admin”,展开“表格”,然后就可以找到它了。


有超过300个用户,我不会逐一展开。你为什么不能告诉我谁创建了这个表呢? - Philip Rego
@PhilipRego 如果您通过脚本访问该表,就像我所演示的那样,您已经拥有了这些信息。在Oracle中,您需要先知道所有者是谁,然后才能访问它。 - vapcguy
我不确定我是否理解您的意思。我没有任何指定语句中用户的脚本。我无法更改表格并且不知道如何查看所有者是谁。我只能使用 select * [tablename] 查看表格。 - Philip Rego
@PhilipRego 我不知道你怎么可能在没有指定所有者的情况下,通过 select * [tablename](无论如何你都忘了 from)访问表格,除非是你登录的用户拥有它。 - vapcguy

4
您可能没有权限访问 SQL Developer 3 查询的元表之一。如果我选对了查询语句,它会运行以下 SELECT 语句:
select * from (
  SELECT o.OBJECT_NAME, o.OBJECT_ID ,'' short_name, decode(bitand(t.property, 32), 32, 'YES', 'NO') partitioned,
                decode(bitand(t.property, 64), 64, 'IOT',
               decode(bitand(t.property, 512), 512, 'IOT_OVERFLOW',
               decode(bitand(t.flags, 536870912), 536870912, 'IOT_MAPPING', null))) iot_type, 
         o.OWNER OBJECT_OWNER, o.CREATED, o.LAST_DDL_TIME, O.GENERATED, O.TEMPORARY, case when xt.obj# is null then 'N' else 'Y' end EXTERNAL
    FROM SYS.Dba_OBJECTS O ,sys.tab$ t, sys.external_tab$ xt
    WHERE O.OWNER = :SCHEMA
    and   o.object_id = t.obj#(+)
    and   o.object_id = xt.obj#(+)
    AND O.OBJECT_TYPE = 'TABLE' 
union all
SELECT OBJECT_NAME, OBJECT_ID , syn.SYNONYM_NAME short_NAME, decode(bitand(t.property, 32), 32, 'YES', 'NO') partitioned,
                decode(bitand(t.property, 64), 64, 'IOT',
               decode(bitand(t.property, 512), 512, 'IOT_OVERFLOW',
               decode(bitand(t.flags, 536870912), 536870912, 'IOT_MAPPING', null))) iot_type, 
       SYN.TABLE_OWNER OBJECT_OWNER, o.CREATED, o.LAST_DDL_TIME, O.GENERATED, O.TEMPORARY, case when xt.obj# is null then 'N' else 'Y' end EXTERNAL
              FROM SYS.Dba_OBJECTS O, sys.user_synonyms syn,sys.tab$ t, sys.external_tab$ xt
              WHERE  syn.table_owner = o.owner
              and    syn.TABLE_NAME = o.object_NAME
              and    o.object_id = t.obj#
              and   o.object_id = xt.obj#(+)
              and    o.object_type = 'TABLE'
              and    :INCLUDE_SYNS = 1
)
 where /**/object_name not in (select object_name from recyclebin)
                         AND not object_name like 'BIN$%'

尝试运行此语句,以获取完整的错误消息,指示哪个表不存在(相当于“由于缺少访问权限而不可见”)。 SQL开发人员将要求为SCHEMAINCLUDE_SYNS设置值。将SCHEMA设置为您的用户名,并将INCLUDE_SYNS设置为0。SQL Developer 1.1可能使用了一个更简单的查询,适用于您的访问权限。

感谢您的输入。我使用了上面的查询,但它在 sys.external_tab$ 附近失败了。所以我可能需要请求那里的权限。Oracle论坛中的一篇帖子也让我得出了同样的结论。但是您的解释更加全面。非常非常感谢您。 - sammy
在后续的跟进中,我发现在一些运行良好的连接中无法访问 external_tab$。因此,上述查询可能不是 SQL Developer 用户用来显示其表格列表的查询。 - sammy

0
我通过以下步骤解决了这个问题:
- 表格 => 应用筛选器... - 移除条件 X - 选择覆盖模式筛选器 - 确定

0

0

创建连接所使用的身份确定了您在Oracle中可以看到哪些表。您在设置新版本连接时是否提供了不同的凭据?


不,用户凭据在两个版本中是相同的。 - sammy
嗯,这是整体升级的一部分吗(例如升级到Oracle 11.g)? 你使用什么类型的连接?(TNS,Basic..) 你的TNS文件是否相同?(试图从基础开始,如果您已经查看了这些项目,请原谅..) - Cos Callis
我在两个版本中都使用基本连接类型。我不太了解TNS文件,但我没有对它做任何操作,所以我想那应该不是问题。 - sammy
刚刚注意到有趣的事情...每次我刷新连接树中的表文件夹时,日志页面显示类似于“SEVERE 100 0 oracle.dbtools.db.DBUtil 警告,未处理的异常:ORA-00942:表或视图不存在”的内容。 - sammy

0

grant select on sys.external_tab$ to [myUser]; 对我有用。谢谢Codo


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接