Oracle SQL Query สำหรับแสดงรายการ Schemas ทั้งหมดในฐานข้อมูล


98

ฉันต้องการลบสคีมาที่ไม่ได้ใช้ใน Oracle DB ของเรา

ฉันจะค้นหาชื่อสคีมาทั้งหมดได้อย่างไร


1
คำจำกัดความของคำว่า "ไม่ได้ใช้" คืออะไร?
APC

ฉันกำลังทำโปรเจ็กต์การย้ายข้อมูลและนักพัฒนาทุกคนมีชุดสคีมาของตัวเอง (นักพัฒนาบางคนออกไปและชุดสคีมาบางชุดจะไม่ได้ใช้อีกต่อไป)
vicsz

คำตอบ:


131

ใช้ sqlplus

sqlplus / เป็น sysdba

วิ่ง:

เลือก * 
จาก dba_users

หากคุณต้องการให้เฉพาะชื่อผู้ใช้ทำสิ่งต่อไปนี้:

เลือกชื่อผู้ใช้ 
จาก dba_users

1
ตรวจสอบให้แน่ใจว่าคุณมีสิทธิ์สำหรับผู้ใช้ของคุณอย่างไรก็ตาม
diagonalbatman

2
@ แอนดี้: นั่นคือเหตุผลที่ฉันเขียนว่า "ในฐานะผู้ใช้ที่มีสิทธิพิเศษ";)
a_horse_with_no_name

@horse ขอโทษที่ฉันพลาดไป
diagonalbatman

@a_horse_with_no_name หมายความว่าสคีมาใน oracle หมายความว่าเป็นผู้ใช้หรือไม่? ฉันหมายถึง schema = ผู้ใช้? และภายใต้ผู้ใช้นั้นตารางทั้งหมดที่สร้างขึ้นเช่นเดียวกับ MySQL?
Osama Al-Banna

66

เป็นไปได้มากที่คุณต้องการ

SELECT username
  FROM dba_users

ซึ่งจะแสดงให้คุณเห็นผู้ใช้ทั้งหมดในระบบ (และสคีมาที่เป็นไปได้ทั้งหมด) หากคำจำกัดความของ "สคีมา" ทำให้สคีมาว่างเปล่านั่นคือสิ่งที่คุณต้องการ อย่างไรก็ตามอาจมีความแตกต่างทางความหมายที่ผู้คนต้องการเรียกบางสิ่งว่าสคีมาหากเป็นเจ้าของออบเจ็กต์อย่างน้อยหนึ่งรายการจริง ๆ เพื่อให้ไม่รวมบัญชีผู้ใช้หลายร้อยบัญชีที่ไม่เคยเป็นเจ้าของวัตถุใด ๆ ในกรณีนั้น

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

สมมติว่าใครก็ตามที่สร้างสกีมามีความสมเหตุสมผลเกี่ยวกับการกำหนดพื้นที่ตารางเริ่มต้นและสมมติว่าคุณไม่สนใจสคีมาที่ Oracle ส่งมอบให้คุณสามารถกรองสคีมาเหล่านั้นออกได้โดยการเพิ่มเพรดิเคตในdefault_tablespaceเช่น

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

หรือ

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

มันไม่ใช่เรื่องแปลกชะมัดจะเจอระบบที่มีคนรับผู้ใช้ที่ไม่ใช่ระบบไม่ถูกต้องdefault_tablespaceของSYSTEMแต่เพื่อให้แน่ใจว่าสมมติฐานที่ค้างไว้ก่อนที่จะพยายามที่จะกรองออกสกีมาออราเคิลส่งด้วยวิธีนี้


รวมสิ่งนี้เข้ากับตำแหน่งที่เพรดิเคตจากข้อความค้นหาของ FeRtoll และคุณจะมีแบบสอบถามที่ค่อนข้างปลอดภัย (ไม่น่าจะเป็นระบบค้นหา Cobber SYS หรือ SYSTEM)
Karl

1
แตกต่างจากselect distinct owner from dba_objectsอย่างไร?
Dawood ibn Kareem

1
ในอินสแตนซ์ Oracle ที่สะอาดการสอบถามของคุณ
@David

28
SELECT username FROM all_users ORDER BY username;

2
มีประโยชน์มากหากผู้ใช้ของคุณไม่มีสิทธิ์dba_users(เช่นข้อผิดพลาดORA-00942 : table or view does not exist)
Dinei

1
แต่เอาต์พุตระหว่าง dba_users และ 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'));

ตามที่ฉันเข้าใจแล้วแบบสอบถามนี้จะแสดงสคีมาทั้งหมดที่มีตารางใด ๆ นั่นถูกต้องใช่ไหม?
Andrew Spencer

1
สิ่งนี้จะทำงานได้อย่างน่าเชื่อถือใน Oracle เวอร์ชันเก่าเท่านั้น ด้วยการสร้างส่วนที่รอการตัดบัญชีเป็นไปได้ที่จะมีวัตถุที่ไม่มีเซ็กเมนต์
Jon Heller

4

เกี่ยวกับ :

SQL> select * from all_users;

มันจะส่งคืนรายชื่อผู้ใช้ / สกีมาทั้งหมด ID และวันที่ที่สร้างใน DB:

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

4

ด้านล่าง sql แสดงสคีมาทั้งหมดใน oracle ที่สร้างขึ้นหลังการติดตั้ง ORACLE_MAINTAINED = 'N' คือตัวกรอง คอลัมน์นี้เป็นคอลัมน์ใหม่ใน 12c

เลือกชื่อผู้ใช้ที่แตกต่างกัน ORACLE_MAINTAINED จาก dba_users โดยที่ ORACLE_MAINTAINED = 'N';

2

SQL ต่อไปนี้จะส่งคืนสคีมาทั้งหมดใน Oracle DB

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

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