Truy vấn SQL của Oracle để liệt kê tất cả các Lược đồ trong DB


96

Tôi muốn xóa một số lược đồ không sử dụng trên DB oracle của chúng tôi.

Làm cách nào để tôi có thể truy vấn cho tất cả các tên lược đồ?


1
Định nghĩa của bạn về "không sử dụng" là gì?
APC

Tôi đang làm việc trên một dự án di chuyển dữ liệu và mỗi nhà phát triển đều có một bộ lược đồ của riêng họ. (Một số nhà phát triển đã rời đi và một số bộ lược đồ không còn được sử dụng).
vicsz

Câu trả lời:


130

Sử dụng sqlplus

sqlplus / as sysdba

chạy:

LỰA CHỌN * 
FROM dba_users

Nếu bạn chỉ muốn tên người dùng làm như sau:

Chọn tên người dùng 
FROM dba_users

1
Tuy nhiên, hãy đảm bảo rằng bạn có quyền đối với người dùng của mình.
crossonalbatman

2
@Andy: đó là lý do tại sao tôi đã viết "như một người sử dụng đặc quyền";)
a_horse_with_no_name

@horse Xin lỗi tôi đã bỏ lỡ điều đó.
crossonalbatman,

@a_horse_with_no_name điều đó có nghĩa là một lược đồ trong oracle có nghĩa là đó là một người dùng? Ý tôi là một giản đồ = người dùng? và dưới người dùng đó, tất cả các bảng được tạo giống như MySQL?
Osama Al-Banna

66

Rất có thể, bạn muốn

SELECT username
  FROM dba_users

Điều đó sẽ hiển thị cho bạn tất cả người dùng trong hệ thống (và do đó tất cả các lược đồ tiềm năng). Nếu định nghĩa của bạn về "lược đồ" cho phép một giản đồ trống, đó là điều bạn muốn. Tuy nhiên, có thể có sự khác biệt về ngữ nghĩa khi mọi người chỉ muốn gọi một thứ gì đó là một lược đồ nếu nó thực sự sở hữu ít nhất một đối tượng để hàng trăm tài khoản người dùng sẽ không bao giờ sở hữu bất kỳ đối tượng nào bị loại trừ. Trong trường hợp đó

SELECT username
  FROM dba_users u
 WHERE EXISTS (
    SELECT 1
      FROM dba_objects o
     WHERE o.owner = u.username )

Giả sử rằng bất cứ ai tạo ra các lược đồ là hợp lý về giao tablespaces mặc định và giả định rằng bạn không quan tâm đến schemas rằng Oracle đã cung cấp, bạn có thể lọc ra những schemas bằng cách thêm các vị từ trên default_tablespace, tức là

SELECT username
  FROM dba_users
 WHERE default_tablespace not in ('SYSTEM','SYSAUX')

hoặc là

SELECT username
  FROM dba_users u
 WHERE EXISTS (
    SELECT 1
      FROM dba_objects o
     WHERE o.owner = u.username )
   AND default_tablespace not in ('SYSTEM','SYSAUX')

Nó không phải là khủng khiếp lạ khi đi qua một hệ thống mà ai đó đã không đúng cho một người sử dụng một tổ chức phi hệ thống default_tablespacecủa SYSTEM, mặc dù, vì vậy hãy chắc chắn rằng các giả định giữ trước khi cố gắng để lọc ra các lược đồ Oracle-giao theo cách này.


Kết hợp điều này với vị từ where từ truy vấn của FeRtoll và bạn sẽ có một truy vấn khá an toàn (không có khả năng giống với SYS hoặc SYSTEM).
Karl

1
Làm thế nào là khác nhau từ select distinct owner from dba_objects?
Dawood ibn Kareem

1
Cũng trên một phiên bản Oracle sạch sẽ, truy vấn của bạn, @David, mang lại một chủ sở hữu PUBLIC bổ sung
perlyking

28
SELECT username FROM all_users ORDER BY username;

2
Rất hữu ích nếu người dùng của bạn không có đặc quyền trên dba_users(ví dụ: lỗi ORA-00942 : table or view does not exist)
Dinei

1
nhưng đầu ra có giống nhau giữa dba_users và all_users không?
Shailesh Pratapwar

8
select distinct owner 
from dba_segments
where owner in (select username from dba_users where default_tablespace not in ('SYSTEM','SYSAUX'));

Theo tôi hiểu, truy vấn này sẽ hiển thị tất cả các lược đồ có chứa bất kỳ bảng nào. Có đúng không?
Andrew Spencer

1
Điều này sẽ chỉ hoạt động đáng tin cậy trong các phiên bản cũ hơn của Oracle. Với việc tạo phân đoạn hoãn lại, có thể có một đối tượng không có phân đoạn.
Jon Heller

4

Làm thế nào về :

SQL> select * from all_users;

nó sẽ trả về danh sách tất cả người dùng / lược đồ, ID của họ và ngày được tạo trong DB:

USERNAME                          USER_ID CREATED
------------------------------ ---------- ---------
SCHEMA1                         120 09-SEP-15
SCHEMA2                         119 09-SEP-15
SCHEMA3                         118 09-SEP-15

3

Dưới đây sql liệt kê tất cả lược đồ trong oracle được tạo sau khi cài đặt ORACLE_MAINTAINED = 'N' là bộ lọc. Cột này là mới trong 12c.

chọn tên người dùng riêng biệt, ORACLE_MAINTAINED từ dba_users trong đó ORACLE_MAINTAINED = 'N';

1

Một trong các SQL sau sẽ trả về tất cả lược đồ trong Oracle DB.

  1. select owner FROM all_tables group by owner;
  2. select distinct owner FROM all_tables;

1
Có thể có các lược đồ chỉ có các đối tượng không phải bảng trong đó, mà các truy vấn của bạn sẽ không liệt kê.
Matthew McPeak
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.