DB内のすべてのスキーマをリストするためのOracle SQLクエリ


96

Oracle DBの未使用のスキーマをいくつか削除したかったのです。

すべてのスキーマ名を照会するにはどうすればよいですか?


1
「未使用」の定義を教えてください。
APC

私はデータ移行プロジェクトに取り組んでおり、すべての開発者が独自のスキーマのセットを持っています。(一部の開発者が去り、一部のスキーマセットは使用されなくなりました)。
vicsz '31年

回答:


130

sqlplusの使用

sqlplus / sysdbaとして

実行:

選択する * 
FROM dba_users

ユーザー名だけが必要な場合は、次の操作を行います。

ユーザー名を選択 
FROM dba_users

1
ただし、ユーザーに対する権限があることを確認してください。
対角線

2
@Andy:それが私が「特権ユーザーとして」と書いた理由です;)
a_horse_with_no_name

@horseお詫び私はそれを逃した。
対角線

@a_horse_with_no_nameこれは、oracleのスキーマがユーザーであることを意味しますか?schema = userですか?そのユーザーの下で、MySQLのように作成されたすべてのテーブル
Osama Al-Banna 2016年

66

ほとんどの場合、あなたが欲しい

SELECT username
  FROM dba_users

これにより、システム内のすべてのユーザー(およびすべての潜在的なスキーマ)が表示されます。「スキーマ」の定義でスキーマを空にできる場合は、それが必要です。ただし、実際には少なくとも1つのオブジェクトを所有している場合にのみスキーマを呼び出す必要があるため、オブジェクトを決して所有しない数百のユーザーアカウントが除外されるという意味上の違いがある場合があります。その場合

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

誰かが誤って非システムユーザa与えられたシステムに遭遇することひどく珍しいことではありませんdefault_tablespaceのがSYSTEM、しかし、その前提は、Oracleが提供するスキーマからフィルターにこの方法を試す前に、保持することを確信します。


これとFeRtollのクエリからのwhere述語を組み合わせると、かなり安全な(SYSまたはSYSTEMを実行する可能性が低い)クエリが得られます。
Karl

1
それはどう違うのselect distinct owner from dba_objectsですか?
Dawood ibnカリーム2013

1
クリーンなOracleインスタンスでは、クエリ@Davidは追加のPUBLIC所有者を生成します
2013年

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 2017年

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

3

以下のsqlは、インストール後に作成されるoracleのすべてのスキーマをリストします。ORACLE_MAINTAINED= 'N'はフィルターです。この列は12cの新機能です。

ORACLE_MAINTAINED = 'N'であるdba_usersから、異なるユーザー名、ORACLE_MAINTAINEDを選択します。

1

次のいずれかのSQLは、Oracle DB内のすべてのスキーマを返します。

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

1
クエリでリストされない非テーブルオブジェクトのみが含まれるスキーマが存在する場合があります。
マシューマクピーク2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.