Oracle SQL Query для перечисления всех схем в БД

97

Я хотел удалить некоторые неиспользуемые схемы в нашей базе данных Oracle.

Как я могу запросить все имена схем?

Викш
источник
1
Как вы определяете «неиспользованный»?
APC
Я работаю над проектом по миграции данных, и у каждого разработчика есть свой набор схем. (Некоторые разработчики ушли, а некоторые наборы схем больше не используются).
vicsz

Ответы:

130

Использование sqlplus

sqlplus / как sysdba

бегать:

ВЫБРАТЬ * 
ОТ dba_users

Если вы хотите, чтобы имена пользователей делали следующее:

ВЫБЕРИТЕ имя пользователя 
ОТ dba_users
a_horse_with_no_name
источник
1
Однако убедитесь, что у вас есть разрешения для вашего пользователя.
diagonalbatman
2
@Andy: вот почему я написал «как привилегированный пользователь»;)
a_horse_with_no_name
@horse Извините, я пропустил это.
diagonalbatman
@a_horse_with_no_name означает ли это, что схема в Oracle означает, что это пользователь? Я имею ввиду схему = пользователь? и под этим пользователем все таблицы созданы так же, как MySQL?
Усама Аль-Банна
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, хотя, так что будьте уверены , что предположения , провести , прежде чем пытаться отфильтровать Oracle устанавливаемых схемы таким образом.

Джастин Кейв
источник
Объедините это с предикатом where из запроса FeRtoll, и вы получите достаточно безопасный (вряд ли запутанный SYS или SYSTEM) запрос.
Karl
1
Чем это отличается от select distinct owner from dba_objects?
Давуд ибн Карим,
1
Что ж, на чистом экземпляре Oracle ваш запрос, @David, дает дополнительного владельца PUBLIC
perlyking
28
SELECT username FROM all_users ORDER BY username;
Suhprano
источник
2
Очень полезно, если у вашего пользователя нет прав на dba_users(например: ошибка ORA-00942 : table or view does not exist)
Dinei
1
но одинаковы ли результаты для dba_users и all_users?
Шайлеш Пратапвар
8
select distinct owner 
from dba_segments
where owner in (select username from dba_users where default_tablespace not in ('SYSTEM','SYSAUX'));
FeRtoll
источник
Насколько я понимаю, этот запрос выведет все схемы, содержащие какие-либо таблицы. Это правильно?
Эндрю Спенсер
1
Это будет надежно работать только в более старых версиях Oracle. При отложенном создании сегмента возможно создание объекта без сегмента.
Джон Хеллер
4

Как насчет :

SQL> select * from all_users;

он вернет список всех пользователей / схем, их идентификаторы и дату, созданные в БД:

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
Могут быть схемы, в которых есть только объекты, не являющиеся таблицами, которые ваши запросы не будут перечислять.
Мэтью