2011-01-28 23 views
66

私たちのoracle DB上で未使用のスキーマをいくつか削除したかったのですが、DB内のすべてのスキーマをリストするOracle SQLクエリ

どのようにしてすべてのスキーマ名を問い合せることができますか?

+1

"未使用" のあなたの定義は何ですか? – APC

+0

私はデータマイグレーションプロジェクトに取り組んでいます。すべての開発者は独自のスキーマセットを持っています。(一部の開発者は辞めてしまい、一部のスキーマセットは使用されなくなりました)。 – vicsz

答えて

99

sqlplusを使用して

SQLPLUS/SYSDBAとして

実行:

 
SELECT username 
FROM dba_users 
+1

ただし、あなたのユーザーに権限があることを確認してください。 – diagonalbatman

+1

十分に良い、最初に答えるために+1。 – vicsz

+2

@Andy:それで私は "特権ユーザー"と書いていた;) –

54

はほとんどの場合、あなたは

をしたい:

 
SELECT * 
FROM dba_users 

は、あなただけのユーザー名は、次の操作を実行したいなら

SELECT username 
    FROM dba_users 

これは、システム内のすべてのユーザー(したがって、すべての潜在的なスキーマ)を表示します。 「スキーマ」の定義でスキーマを空にすることができる場合は、それが必要です。ただし、オブジェクトを所有していない何百ものユーザーアカウントが除外されるように、少なくとも1つのオブジェクトを実際に所有している場合にのみスキーマを呼び出すというセマンティックな区別があります。その場合、誰がスキーマはつまり、デフォルトの表領域を割り当て、あなたがdefault_tablespaceに述語を追加することによって、それらのスキーマを除外することができ、Oracleが提供してきましたスキーマに興味がないことを前提に関する賢明だっ作成したと仮定すると

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

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になっていることを誤って認識しているため、このようにOracle提供のスキーマを除外しようとする前に前提が保持されていることを確認してください。

+0

これをFeRtollのクエリのwhere述語と組み合わせれば、かなり安全です(SYSまたはSYSTEMの検索はしません)。 – Karl

+1

これは 'dba_objectsからの別個の所有者の選択 'とどのように違いますか? –

+1

クリーンなOracleインスタンスでは、@Davidというクエリが追加のPUBLICオーナ – perlyking

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

を生成します。これを理解すると、このクエリはテーブルを含むすべてのスキーマを表示します。そうですか? –

+1

これは、古いバージョンのOracleでは確実に機能します。繰延セグメントの作成では、セグメントを持たないオブジェクトを持つことが可能です。 –

21
どの程度
SELECT username FROM all_users ORDER BY username; 
+0

ユーザが 'dba_users'に特権を持っていない場合(例えば' ORA-00942:テーブルまたはビューが存在しません ') – Dinei

+0

ですが、dba_usersとall_usersの出力は同じですか? – Shinchan

2

:それは、すべてのユーザー/スキーマ、自分のIDとDBで作成された日付のリストを返します

SQL> select * from all_users; 

:SQLリストの下

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

すべてORACLE_MAINTAINED = 'N'はフィルタです。インストール後に作成されるOracleのスキーマ ORACLE_MAINTAINED = 'N'はフィルタです。このコラムは12cの新機能です。

select distinct username,ORACLE_MAINTAINED from dba_users where ORACLE_MAINTAINED='N';
0

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

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

クエリには表示されないテーブル以外のオブジェクトのみが含まれるスキーマが存在することがあります。 –

関連する問題