Tôi muốn xóa một số lược đồ không sử dụng trên DB của chúng tôi.Truy vấn SQL Oracle để liệt kê tất cả các lược đồ trong một DB
Tôi làm cách nào để truy vấn tất cả các tên lược đồ?
Tôi muốn xóa một số lược đồ không sử dụng trên DB của chúng tôi.Truy vấn SQL Oracle để liệt kê tất cả các lược đồ trong một DB
Tôi làm cách nào để truy vấn tất cả các tên lược đồ?
dùng sqlplus
sqlplus/as sysdba
chạy:
SELECT * FROM dba_users
nên bạn chỉ muốn tên người dùng thực hiện như sau:
SELECT username FROM dba_users
Đảm bảo rằng bạn có quyền đối với người dùng của mình. – diagonalbatman
Đủ tốt, +1 để trả lời trước. – vicsz
@Andy: đó là lý do tại sao tôi đã viết "là người dùng đặc quyền";) –
Nhiều khả năng, bạn muốn
SELECT username
FROM dba_users
Điều đó sẽ cho bạn thấy 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 lược đồ trống, đó là những gì bạn muốn. Tuy nhiên, có thể có một sự khác biệt ngữ nghĩa nơi mọi người chỉ muốn gọi một cái gì đó 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
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 đó có tuy nhiên, không được cung cấp cho người dùng không có hệ thống một số không đúng là default_tablespace
của SYSTEM
, do đó 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 đồ được Oracle phân phối theo cách này.
Kết hợp điều này với vị từ của truy vấn FeRtoll và bạn sẽ có một truy vấn khá an toàn (không có khả năng cobber SYS hoặc SYSTEM). – Karl
Điều này khác với 'chọn chủ sở hữu riêng biệt từ dba_objects' như thế nào? –
Cũng trên một cá thể Oracle sạch, truy vấn của bạn, @David, mang lại một chủ sở hữu PUBLIC bổ sung – perlyking
select distinct owner
from dba_segments
where owner in (select username from dba_users where default_tablespace not in ('SYSTEM','SYSAUX'));
Như 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? –
Đ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 trì hoãn, có thể có một đối tượng không có phân đoạn. –
Làm thế nào về:
SQL> select * from all_users;
nó sẽ trở lại danh sách tất cả người dùng/schemas, ID của họ và ngày tạo trong DB:
USERNAME USER_ID CREATED
------------------------------ ---------- ---------
SCHEMA1 120 09-SEP-15
SCHEMA2 119 09-SEP-15
SCHEMA3 118 09-SEP-15
Dưới đây danh sách sql tất cả các lược đồ trong oracle được tạo sau khi cài đặt ORACLE_MAINTAINED = 'N' là bộ lọc. Cột này mới trong 12c.
select distinct username,ORACLE_MAINTAINED from dba_users where ORACLE_MAINTAINED='N';
Một trong hai SQL sau sẽ trả về tất cả lược đồ trong Oracle DB.
select owner FROM all_tables group by owner;
select distinct owner FROM all_tables;
Có thể có các lược đồ chỉ có các đối tượng không phải bảng trong đó các truy vấn của bạn sẽ không liệt kê. –
định nghĩa lại "không sử dụng" là gì? – APC
Tôi đang làm việc trên một dự án datamigration và mọi nhà phát triển đều có bộ lược đồ riêng của họ.(Một số nhà phát triển đã để lại và một số bộ lược đồ không còn được sử dụng nữa). – vicsz