2010-02-11 93 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

相關問題