2010-02-11 91 views

回答

166

要看到另一个架构中的所有表,你需要有以下系统权限的一种或多种:

SELECT ANY DICTIONARY 
(SELECT | INSERT | UPDATE | DELETE) ANY TABLE 

或大铁锤,DBA角色。

在使用这些的,你可以选择:

SELECT DISTINCT OWNER, OBJECT_NAME 
    FROM DBA_OBJECTS 
WHERE OBJECT_TYPE = 'TABLE' 
    AND OWNER = '[some other schema]' 

没有这些系统权限,你只能看到你的表已被授予访问权限的一定程度,无论是直接还是通过角色。

SELECT DISTINCT OWNER, OBJECT_NAME 
    FROM ALL_OBJECTS 
WHERE OBJECT_TYPE = 'TABLE' 
    AND OWNER = '[some other schema]' 

最后,您可以随时查询数据字典为自己的表,因为你对你的表的权利不能被撤销(如10克):

SELECT DISTINCT OBJECT_NAME 
    FROM USER_OBJECTS 
WHERE OBJECT_TYPE = 'TABLE' 
+2

除了使用'%_OBJECTS'而不是'%_TABLES'外,还有“最完整的答案”。 – APC 2010-02-12 07:14:54

+0

我记得在9i中,视图将在%_TABLES中列出 - 例如,试图自动清空架构最终会导致诸如DROP TABLE REALLY_A_VIEW CASCADE CONSTRAINTS抛出错误之类的语句。因此,您必须使用MINUS/NOT IN/NOT EXISTS删除视图,或者再次运行%_OBJECTS。另外,针对%_OBJECTS还留下了一些诱人的暗示! – 2010-02-12 16:45:44

+1

查询中绝对不需要“DISTINCT”。 'owner,object_name'在'ALL_OBJECTS'中是唯一的 – 2013-08-20 09:17:21

11

您可以查询USER_TABLES

select TABLE_NAME from user_tables 
+4

这就是您的架构中的所有表,而不是A架构中的所有表。此外,* _ TABLEBLES数据字典视图(DBA_TABLES,ALL_TABLES,USER_TABLES)包含视图。 – 2010-02-11 21:04:43

+0

将“包含视图”替换为“可以包含Oracle版本的视图”。 – 2010-02-11 21:14:53

+0

@Adam Musch使用Oracle 10g R2进行测试,它没有返回视图。 – Sathya 2010-02-11 23:27:21

3

试试这个,更换?与您的架构名称

select TABLE_NAME from INFORMATION_SCHEMA.TABLES 
WHERE TABLE_SCHEMA =? 
    AND TABLE_TYPE = 'BASE TABLE' 
+1

这是更多的数据库不可知论者,所以我认为这种类型的解决方案比所有的替代方案更好。我认为INFORMATION_SCHEMA只适用于我见过的每个主要数据库。虽然有些信息可能会有所不同,但至少它是一个一致的地方。然而,通过快速的互联网搜索,Oracle似乎是唯一不支持Information_Schema的数据库,尽管它是SQL-92标准的一部分。 – Kibbee 2010-02-11 21:19:19

+5

当然,OP特别要求Oracle解决方案... – DCookie 2010-02-11 22:01:41

52
SELECT table_name from all_tables where owner = 'YOURSCHEMA'; 
+4

schemanaame应该在大写 – 2010-02-11 22:27:53

+2

这将只显示* YOURSCHEMA中的所有*表,如果由YOURSCHEMA运行或由具有Adam Musch提及的特权的用户运行。否则,它只显示YOURSCHEMA中我们已被授予权限的表。 – APC 2010-02-12 07:17:55

2

如果您正在使用JDBC(Java)的访问Oracle,你可以使用DatabaseMetadata类。如果您使用ADO.NET访问Oracle,则可以使用类似的方法。

如果您使用ODBC访问Oracle,则可以使用SQLTables函数。否则,如果您只需要SQLPlus或类似的Oracle客户端中的信息,则已经提到的其中一个查询将会执行。例如:

select TABLE_NAME from user_tables 
4

如果你登录为普通用户没有DBA权限,您可以使用以下命令查看您自己的模式的所有表和视图。

select * from tab; 
1
select * from cat; 

它会显示在USER_CATALOG你的架构猫代名词所有表

0
select TABLE_NAME from user_tables; 

上面的查询会给你出现在该用户的所有表的名称;

2
select * from user_tables; 

(显示所有表)

0

如果您需要获得表的大小为好,这将是得心应手:

select SEGMENT_NAME, PARTITION_NAME, BYTES from user_segments where SEGMENT_TYPE='TABLE' order by 1

1

SELECT表名,所有者FROM ALL_TABLES哪里owner ='schema_name'order by table_name

相关问题