Oracle SQL Query zum Auflisten aller Schemas in einer Datenbank


96

Ich wollte einige nicht verwendete Schemas in unserer Oracle-Datenbank löschen.

Wie kann ich alle Schemanamen abfragen?


1
Was ist Ihre Definition von "unbenutzt"?
APC

Ich arbeite an einem Datenmigrationsprojekt, und jeder Entwickler hat seine eigenen Schemata. (Einige Entwickler sind gegangen und einige Schemasätze werden nicht mehr verwendet.)
Vicsz

Antworten:


130

Verwenden von sqlplus

sqlplus / as sysdba

Lauf:

WÄHLEN * 
FROM dba_users

Wenn Sie nur die Benutzernamen möchten, gehen Sie wie folgt vor:

Benutzernamen auswählen 
FROM dba_users

1
Stellen Sie jedoch sicher, dass Sie über Berechtigungen für Ihren Benutzer verfügen.
Diagonalbatman

2
@ Andy: Deshalb habe ich "als privilegierter Benutzer" geschrieben;)
a_horse_with_no_name

@horse Entschuldigung, das habe ich verpasst.
Diagonalbatman

@a_horse_with_no_name bedeutet das, dass ein Schema in Oracle bedeutet, dass es ein Benutzer ist? Ich meine ein Schema = Benutzer? und unter diesem Benutzer alle Tabellen wie MySQL erstellt?
Osama Al-Banna

66

Höchstwahrscheinlich möchten Sie

SELECT username
  FROM dba_users

Das zeigt Ihnen alle Benutzer im System (und damit alle möglichen Schemata). Wenn Ihre Definition von "Schema" zulässt, dass ein Schema leer ist, möchten Sie dies. Es kann jedoch eine semantische Unterscheidung geben, bei der Benutzer etwas nur dann als Schema bezeichnen möchten, wenn es tatsächlich mindestens ein Objekt besitzt, sodass die Hunderte von Benutzerkonten, die niemals Objekte besitzen, ausgeschlossen werden. In diesem Fall

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

Angenommen, derjenige, der die Schemas erstellt hat, war sinnvoll, Standardtabellenbereiche zuzuweisen, und wenn Sie nicht an von Oracle bereitgestellten Schemas interessiert sind, können Sie diese Schemas herausfiltern, indem Sie Prädikate für das hinzufügen default_tablespace, d. H.

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

oder

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

Es ist jedoch nicht ungewöhnlich, dass Sie auf ein System stoßen, bei dem jemand einem Nicht-Systembenutzer fälschlicherweise eine default_tablespacevon gegeben SYSTEMhat. Stellen Sie daher sicher, dass die Annahmen zutreffen , bevor Sie versuchen, die von Oracle bereitgestellten Schemata auf diese Weise herauszufiltern.


Wenn Sie dies mit dem Prädikat where aus der FeRtoll-Abfrage kombinieren, erhalten Sie eine ziemlich sichere Abfrage (die SYS oder SYSTEM wahrscheinlich nicht beeinträchtigt).
Karl

1
Wie unterscheidet sich das von select distinct owner from dba_objects?
Dawood ibn Kareem

1
Nun, auf einer sauberen Oracle-Instanz liefert Ihre Abfrage @David einen zusätzlichen PUBLIC-Eigentümer
perlyking

28
SELECT username FROM all_users ORDER BY username;

2
Sehr nützlich, wenn Ihr Benutzer keine Berechtigungen hat dba_users(zB: Fehler ORA-00942 : table or view does not exist)
Dinei

1
Aber ist die Ausgabe zwischen dba_users und all_users gleich?
Shailesh Pratapwar

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

Soweit ich weiß, werden bei dieser Abfrage alle Schemas angezeigt, die Tabellen enthalten. Ist das richtig?
Andrew Spencer

1
Dies funktioniert nur in älteren Versionen von Oracle zuverlässig. Mit der verzögerten Segmenterstellung ist es möglich, ein Objekt ohne Segment zu haben.
Jon Heller

4

Wie wäre es mit :

SQL> select * from all_users;

Es wird eine Liste aller Benutzer / Schemas, deren IDs und Erstellungsdatum in der Datenbank zurückgegeben:

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

3

Unter SQL sind alle Schemata in Oracle aufgeführt, die nach der Installation erstellt wurden. ORACLE_MAINTAINED = 'N' ist der Filter. Diese Spalte ist neu in 12c.

Wählen Sie einen eindeutigen Benutzernamen ORACLE_MAINTAINED aus dba_users aus, wobei ORACLE_MAINTAINED = 'N';

1

Jedes der folgenden SQLs gibt alle Schemas in Oracle DB zurück.

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

1
Möglicherweise gibt es Schemas, die nur Nicht-Tabellenobjekte enthalten, die in Ihren Abfragen nicht aufgeführt sind.
Matthew McPeak
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.