Oracle SQL Query untuk mendaftar semua Skema di DB

96

Saya ingin menghapus beberapa skema yang tidak digunakan pada Oracle DB kami.

Bagaimana saya bisa menanyakan semua nama skema?

vicsz
sumber
1
Apa definisi Anda tentang "tidak terpakai"?
APC
Saya sedang mengerjakan proyek migrasi data, dan setiap pengembang memiliki kumpulan skema mereka sendiri. (Beberapa pengembang telah keluar, dan beberapa kumpulan skema tidak lagi digunakan).
vicsz

Jawaban:

130

Menggunakan sqlplus

sqlplus / sebagai sysdba

Lari:

PILIH * 
DARI dba_users

Jika Anda hanya ingin nama pengguna melakukan hal berikut:

PILIH nama pengguna 
DARI dba_users
seekor kuda tanpa nama
sumber
1
Namun, pastikan Anda memiliki izin pada pengguna Anda.
diagonalbatman
2
@Andy: itulah mengapa saya menulis "sebagai pengguna yang memiliki hak istimewa";)
a_horse_with_no_name
@horse Maaf saya melewatkan itu.
diagonalbatman
@a_horse_with_no_name apakah itu berarti skema di oracle berarti itu pengguna? Maksud saya schema = pengguna? dan di bawah pengguna itu semua tabel dibuat sama seperti MySQL?
Osama Al-Banna
66

Kemungkinan besar, Anda mau

SELECT username
  FROM dba_users

Itu akan menunjukkan kepada Anda semua pengguna di sistem (dan dengan demikian semua skema potensial). Jika definisi Anda tentang "skema" memungkinkan skema menjadi kosong, itulah yang Anda inginkan. Namun, mungkin ada perbedaan semantik di mana orang hanya ingin memanggil sesuatu skema jika sebenarnya memiliki setidaknya satu objek sehingga ratusan akun pengguna yang tidak akan pernah memiliki objek dikecualikan. Dalam hal itu

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

Dengan asumsi bahwa siapa pun yang membuat skema bijaksana tentang menetapkan tablespaces default dan menganggap bahwa Anda tidak tertarik dengan skema yang telah dikirimkan Oracle, Anda dapat memfilter skema tersebut dengan menambahkan predikat pada default_tablespace, yaitu

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

atau

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')

Hal ini tidak terlalu jarang untuk menemukan sebuah sistem di mana seseorang telah salah memberikan pengguna non-sistem default_tablespacedari SYSTEM, meskipun, jadi pastikan bahwa asumsi berlaku sebelum mencoba untuk menyaring skema Oracle-disampaikan dengan cara ini.

Gua Justin
sumber
Gabungkan ini dengan predikat where dari query FeRtoll dan Anda akan mendapatkan query yang cukup aman (tidak mungkin untuk melakukan cobber SYS atau SYSTEM).
Karl
1
Apa bedanya dengan select distinct owner from dba_objects?
Dawood ibn Kareem
1
Nah pada contoh Oracle yang bersih, kueri Anda, @David, menghasilkan pemilik PUBLIK tambahan
mulai
28
SELECT username FROM all_users ORDER BY username;
suhprano
sumber
2
Sangat berguna jika pengguna Anda tidak memiliki hak istimewa pada dba_users(mis .: kesalahan ORA-00942 : table or view does not exist)
Dinei
1
tetapi apakah outputnya sama antara dba_users dan all_users?
Shailesh Pratapwar
8
select distinct owner 
from dba_segments
where owner in (select username from dba_users where default_tablespace not in ('SYSTEM','SYSAUX'));
FeRtoll
sumber
Seperti yang saya pahami, kueri ini akan memunculkan semua skema yang berisi tabel apa pun. Apakah itu benar?
Andrew Spencer
1
Ini hanya akan bekerja dengan andal di versi Oracle yang lebih lama. Dengan pembuatan segmen yang ditangguhkan, dimungkinkan untuk memiliki objek tanpa segmen.
Jon Heller
4

Bagaimana tentang :

SQL> select * from all_users;

itu akan mengembalikan daftar semua pengguna / skema, ID mereka dan tanggal dibuat di DB:

USERNAME                          USER_ID CREATED
------------------------------ ---------- ---------
SCHEMA1                         120 09-SEP-15
SCHEMA2                         119 09-SEP-15
SCHEMA3                         118 09-SEP-15
mauek unak
sumber
3

Di bawah sql daftar semua skema dalam oracle yang dibuat setelah instalasi ORACLE_MAINTAINED = 'N' adalah filternya. Kolom ini baru di 12c.

pilih nama pengguna yang berbeda, ORACLE_MAINTAINED dari dba_users dimana ORACLE_MAINTAINED = 'N';
sidnakoppa
sumber
1

Salah satu dari SQL berikut ini akan mengembalikan semua skema di Oracle DB.

  1. select owner FROM all_tables group by owner;
  2. select distinct owner FROM all_tables;
Sreeju
sumber
1
Mungkin ada skema yang hanya memiliki objek non-tabel di dalamnya, yang tidak akan dicantumkan oleh kueri Anda.
Matthew McPeak