Làm cách nào để liệt kê tất cả các bảng trong một lược đồ trong Oracle SQL?


158

Làm thế nào để tôi liệt kê tất cả các bảng trong một lược đồ trong Oracle SQL?

Câu trả lời:


219

Để xem tất cả các bảng trong một lược đồ khác, bạn cần phải có một hoặc nhiều đặc quyền hệ thống sau:

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

hoặc búa lớn, vai trò DBA.

Với bất kỳ trong số đó, bạn có thể chọn:

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

Nếu không có các đặc quyền hệ thống đó, bạn chỉ có thể thấy các bảng bạn đã được cấp một số mức truy cập, cho dù trực tiếp hoặc thông qua vai trò.

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

Cuối cùng, bạn luôn có thể truy vấn từ điển dữ liệu cho các bảng của riêng mình, vì quyền của bạn đối với các bảng của bạn không thể bị thu hồi (kể từ 10g):

SELECT DISTINCT OBJECT_NAME 
  FROM USER_OBJECTS
 WHERE OBJECT_TYPE = 'TABLE'

2
"câu trả lời đầy đủ nhất" ngoài việc sử dụng %_OBJECTSthay vì %_TABLES.
APC

Tôi nhớ trong 9i rằng các lượt xem sẽ được liệt kê trong% _TABLES - vì vậy, ví dụ, cố gắng tự động làm trống một lược đồ sẽ kết thúc bằng các câu lệnh như DROP TABLE REALLY_A_VIEW CASCADE CONSTRAINTS ném lỗi. Vì vậy, bạn sẽ phải xóa các chế độ xem với MINUS / KHÔNG IN / KHÔNG EXISTS hoặc truy cập lại% _OB DỰ ÁN. Thêm vào đó, việc chống lại% _OBjectS để lại một gợi ý trêu ngươi về những gì khác có thể có trong đó!
Adam Musch

1
Hoàn toàn không cần cho DISTINCTtruy vấn. owner, object_namelà duy nhất trongALL_OBJECTS
a_horse_with_no_name

1
Những truy vấn đó không cần phân biệt, đó là sự thật; tuy nhiên, owner, object_namekhông phải là duy nhất bởi bất kỳ phương tiện nào trong dba_objects; Cả hai Gói và Gói đều xuất hiện trong chế độ xem đó và Bảng và Chỉ mục ở các không gian tên khác nhau.
Adam Musch

Truy vấn cuối cùng sẽ không hoạt động như trong XE 11.2. Dường như không có cột 'chủ sở hữu' trong 'user_objects'.
Rafael Chaves

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

2
Điều này sẽ chỉ hiển thị tất cả các bảng trong YOUSCHema nếu được điều hành bởi YOUSCHema hoặc được điều hành bởi người dùng với các đặc quyền được đề cập bởi Adam Musch. Mặt khác, nó chỉ hiển thị các bảng trong YOUSCHema mà chúng tôi đã được cấp đặc quyền.
APC

14

Bạn có thể truy vấn USER_TABLES

select TABLE_NAME from user_tables

5
Đó là tất cả các bảng trong lược đồ CỦA BẠN, không phải tất cả các bảng trong lược đồ A. Ngoài ra, các chế độ xem từ điển dữ liệu * _TABLES (DBA_TABLES, ALL_TABLES, USER_TABLES) bao gồm các chế độ xem.
Adam Musch

thay thế "bao gồm các khung nhìn" bằng "có thể bao gồm các khung nhìn trong các phiên bản seme của Oracle."
Adam Musch

@Adam Musch Đã thử nghiệm bằng Oracle 10g R2, nó không trả về lượt xem.
Sathyajith Bhat

4

Nếu bạn đăng nhập với tư cách là Người dùng bình thường mà không có sự cho phép của DBA, bạn có thể sử dụng lệnh sau để xem tất cả các bảng và dạng xem của lược đồ của riêng bạn.

select * from tab;

3

Hãy thử điều này, thay thế? với tên lược đồ của bạn

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

3
Đây là cơ sở dữ liệu bất khả tri hơn, và vì vậy tôi nghĩ loại giải pháp này tốt hơn tất cả các giải pháp thay thế. Tôi nghĩ rằng Information_SCHema chỉ hoạt động trên mọi cơ sở dữ liệu chính mà tôi đã thấy. Mặc dù một số khác nhau về những thông tin bạn có thể nhận được, ít nhất đó là một nơi phù hợp để tìm kiếm. Tuy nhiên, từ việc tìm kiếm trên internet nhanh chóng, có vẻ như Oracle chỉ là cơ sở dữ liệu duy nhất không hỗ trợ Information_Schema, mặc dù đó là một phần của tiêu chuẩn SQL-92.
Kibbee

2

Nếu bạn đang truy cập Oracle bằng JDBC (Java), bạn có thể sử dụng lớp DatabaseMetadata . Nếu bạn đang truy cập Oracle bằng ADO.NET, bạn có thể sử dụng một cách tiếp cận tương tự.

Nếu bạn đang truy cập Oracle bằng ODBC, bạn có thể sử dụng chức năng SQLTables .

Mặt khác, nếu bạn chỉ cần thông tin trong SQLPlus hoặc máy khách Oracle tương tự, một trong những truy vấn đã được đề cập sẽ thực hiện. Ví dụ:

select TABLE_NAME from user_tables

2
select * from cat;

nó sẽ hiển thị tất cả các bảng trong từ đồng nghĩa mèo lược đồ của bạn là user_catalog


2
select TABLE_NAME from user_tables;

Truy vấn trên sẽ cung cấp cho bạn tên của tất cả các bảng có trong người dùng đó;


2
select * from user_tables;

(hiển thị tất cả các bảng)


1

CHỌN tên_bảng, chủ sở hữu TỪ all_tables nơi chủ sở hữu = 'lược đồ tên' theo tên_bảng


1

Bạn có thể trực tiếp chạy truy vấn thứ hai nếu bạn biết tên chủ sở hữu.

--Đầu tiên bạn có thể chọn những gì tất cả các chủ sở hữu tồn tại:

SELECT DISTINCT(owner) from SYS.ALL_TABLES;

-Sau đó, bạn có thể thấy các bảng bên dưới của chủ sở hữu đó:

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


0

Nếu bạn cũng cần phải có kích thước của bảng, điều này sẽ rất tiện lợi:

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


0

Tên của bảng và bộ đếm hàng cho tất cả các bảng trong OWNERlược đồ:

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.