DB의 모든 스키마를 나열하기위한 Oracle SQL 쿼리


96

오라클 DB에서 사용하지 않는 스키마를 삭제하고 싶었습니다.

모든 스키마 이름을 어떻게 쿼리 할 수 ​​있습니까?


1
"미사용"의 정의는 무엇입니까?
APC

저는 데이터 마이그레이션 프로젝트를 진행 중이며 모든 개발자는 고유 한 스키마 세트를 가지고 있습니다. (일부 개발자가 떠났고 일부 스키마 세트는 더 이상 사용되지 않습니다).
vicsz

답변:


130

sqlplus 사용

sqlplus / as sysdba

운영:

고르다 * 
dba_users에서

사용자 이름 만 원하는 경우 다음을 수행하십시오.

사용자 이름 선택 
dba_users에서

1
그러나 사용자에 대한 권한이 있는지 확인하십시오.
대각선

2
@Andy : 그 내가 "권한이있는 사용자로"쓴 이유의)
a_horse_with_no_name

@horse 사과 나는 그것을 놓쳤다.
대각선

@a_horse_with_no_name 그것은 오라클의 스키마가 사용자라는 것을 의미합니까? 스키마 = 사용자를 의미합니까? 그 사용자 아래에서 모든 테이블이 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, ie 에 조건자를 추가하여 해당 스키마를 필터링 할 수 있습니다.

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 쿼리의 where 술어와 결합하면 상당히 안전한 (SYS 또는 SYSTEM을 cobber 할 가능성이 없음) 쿼리를 얻을 수 있습니다.
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

3

아래 sql은 설치 후 생성되는 Oracle의 모든 스키마를 나열합니다. ORACLE_MAINTAINED = 'N'은 필터입니다. 이 열은 12c에서 새로 추가되었습니다.

dba_users에서 고유 한 사용자 이름, ORACLE_MAINTAINED를 선택하십시오. 여기서 ORACLE_MAINTAINED = 'N';

1

다음 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.