ฉันจะแสดงรายการตารางทั้งหมดในสคีมาใน Oracle SQL ได้อย่างไร


คำตอบ:


220

หากต้องการดูตารางทั้งหมดในสคีมาอื่นคุณต้องมีสิทธิ์ระบบอย่างน้อยหนึ่งอย่างต่อไปนี้:

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

ฉันจำได้ว่าใน 9i นั้นจำนวนการดูจะถูกแสดงใน% _TABLES - ตัวอย่างเช่นการพยายามล้างสคีมาโดยอัตโนมัติจะจบลงด้วยคำสั่งเช่น DROP Table REALLY_A_VIEW CASCADE CONSTRAINTS ที่ส่งข้อผิดพลาดโดยอัตโนมัติ ดังนั้นคุณต้องลบมุมมองด้วยลบ / ไม่เข้า / ไม่ออกหรือลบ% _OBJECTS นอกจากนี้เมื่อเทียบกับ% _OBJECTS จะทำให้คำใบ้ยั่วเย้าว่ามีอะไรอีกบ้างในนั้น!
Adam Musch

1
ไม่จำเป็นต้องมีDISTINCTในแบบสอบถาม owner, object_nameไม่ซ้ำกันในALL_OBJECTS
a_horse_with_no_name

1
ข้อความค้นหาเหล่านั้นไม่ต้องการความแตกต่างนั่นเป็นเรื่องจริง อย่างไรก็ตามowner, object_nameไม่ได้มีลักษณะเฉพาะใน dba_objects แพ็กเกจแพ็กเกจและแพ็กเกจทั้งสองปรากฏในมุมมองนั้นและตารางและดัชนีอยู่ในเนมสเปซที่แตกต่างกัน
Adam Musch

แบบสอบถามล่าสุดจะไม่ทำงานอย่างที่เป็นอยู่ใน XE 11.2 ไม่มีคอลัมน์ 'เจ้าของ' ใน 'user_objects' ดูเหมือน
Rafael Chaves

71
SELECT table_name  from all_tables where owner = 'YOURSCHEMA';

2
สิ่งนี้จะแสดงตารางทั้งหมดใน YOURSCHEMA หากดำเนินการโดย YOURSCHEMA หรือดำเนินการโดยผู้ใช้ที่มีสิทธิ์พิเศษที่ Adam Musch กล่าวไว้ มิฉะนั้นจะแสดงตารางใน YOURSCHEMA ที่เราได้รับสิทธิ์
APC

14

คุณสามารถสอบถาม USER_TABLES

select TABLE_NAME from user_tables

5
นั่นคือตารางทั้งหมดในสคีมาของคุณไม่ใช่ตารางทั้งหมดในสคีมา นอกจากนี้มุมมองพจนานุกรมข้อมูล * _TABLES (DBA_TABLES, ALL_TABLES, USER_TABLES) รวมถึงมุมมอง
Adam Musch

แทนที่ "รวมมุมมอง" ด้วย "สามารถรวมมุมมองใน Oracle เวอร์ชัน seme"
Adam Musch

@Adam Musch ทดสอบโดยใช้ Oracle 10g R2 มันไม่ได้ส่งคืนมุมมอง
Sathyajith Bhat

4

หากคุณเข้าสู่ระบบในฐานะผู้ใช้ปกติโดยไม่ได้รับอนุญาต DBA คุณสามารถใช้คำสั่งต่อไปนี้เพื่อดูตารางและมุมมองทั้งหมดของสคีมาของคุณเอง

select * from tab;

3

ลองใช้สิ่งนี้แทนที่หรือไม่ ด้วยชื่อสคีของคุณ

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

3
นี่คือฐานข้อมูลที่ไม่เชื่อเรื่องพระเจ้ามากขึ้นและดังนั้นฉันคิดว่าวิธีการแก้ปัญหาประเภทนี้จะดีกว่าทุกทางเลือก ฉันคิดว่า INFORMATION_SCHEMA ใช้ได้กับทุกฐานข้อมูลหลักที่ฉันเคยเห็น แม้ว่าบางคนจะมีข้อมูลที่แตกต่างออกไปบ้าง แต่อย่างน้อยก็เป็นสถานที่ที่เหมาะสมสำหรับการค้นหา อย่างไรก็ตามจากการค้นหาทางอินเทอร์เน็ตอย่างรวดเร็วดูเหมือนว่า Oracle เป็นเพียงฐานข้อมูลเดียวที่ไม่สนับสนุน Information_Schema แม้ว่าจะเป็นส่วนหนึ่งของมาตรฐาน SQL-92
Kibbee

2

หากคุณกำลังเข้าถึง Oracle ด้วย JDBC (Java) คุณสามารถใช้DatabaseMetadataคลาสหากคุณเข้าถึง Oracle ด้วย ADO.NET คุณสามารถใช้แนวทางที่คล้ายกันได้

หากคุณกำลังเข้าถึง Oracle ด้วย ODBC คุณสามารถใช้ฟังก์ชันSQLTables

มิฉะนั้นถ้าคุณต้องการข้อมูลใน SQLPlus หรือไคลเอนต์ Oracle ที่คล้ายกันหนึ่งในแบบสอบถามที่กล่าวถึงแล้วจะทำ ตัวอย่างเช่น

select TABLE_NAME from user_tables


2
select TABLE_NAME from user_tables;

แบบสอบถามด้านบนจะให้ชื่อของตารางทั้งหมดที่มีในผู้ใช้นั้น



1

SELECT table_name, เจ้าของจาก all_tables โดยที่ owner = 'schema_name' สั่งซื้อโดย table_name


1

คุณสามารถเรียกใช้คิวรีที่สองโดยตรงหากคุณรู้จักชื่อเจ้าของ

- ก่อนอื่นคุณสามารถเลือกสิ่งที่เจ้าของทั้งหมดมีอยู่:

SELECT DISTINCT(owner) from SYS.ALL_TABLES;

- จากนั้นคุณสามารถดูตารางภายใต้โดยเจ้าของที่:

SELECT table_name, owner from all_tables where owner like ('%XYZ%');


0

หากคุณต้องการขนาดของโต๊ะเช่นกันสิ่งนี้จะเป็นประโยชน์:

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


0

ชื่อของตัวนับตารางและแถวสำหรับตารางทั้งหมดภายใต้OWNERสคีมา:

SELECT table_name, num_rows counter from DBA_TABLES WHERE owner = 'OWNER'

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.