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

64

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

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

  • 1
    Какое у вас определение "неиспользованный"?
  • 0
    Я работаю над проектом по миграции данных, и у каждого разработчика есть свой набор схем. (Некоторые разработчики ушли, а некоторые наборы схем больше не используются).
Теги:
plsql

7 ответов

97
Лучший ответ

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

sqlplus/as sysdba

пробег:

SELECT * 
FROM dba_users

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

SELECT username 
FROM dba_users
  • 1
    Убедитесь, что у вас есть разрешения для вашего пользователя.
  • 1
    Хорошо, +1 для ответа первым.
Показать ещё 3 комментария
51

Скорее всего, вы хотите

SELECT username
  FROM dba_users

Это покажет вам всех пользователей в системе (и, следовательно, все возможные схемы). Если ваше определение "schema" допускает, чтобы схема была пустой, это то, что вы хотите. Тем не менее, может существовать семантическое различие, когда люди хотят только что-то назвать схемой, если на самом деле она владеет хотя бы одним объектом, поэтому исключаются сотни учетных записей пользователей, которые никогда не будут владеть объектами. В этом случае

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

Предполагая, что тот, кто создал схемы, был разумным в отношении назначения табличных пространств по умолчанию и предполагая, что вас не интересуют схемы, которые поставлял Oracle, вы можете отфильтровывать эти схемы, добавляя предикаты в default_tablespace, i.e.

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 of SYSTEM, однако, будьте уверены, что предположения сохраняются, прежде чем пытаться отфильтровать поставляемый Oracle схемы таким образом.

  • 0
    Объедините это с предикатом where из запроса FeRtoll, и вы получите довольно безопасный (маловероятно, чтобы обрабатывать SYS или SYSTEM) запрос.
  • 1
    Чем это отличается от select distinct owner from dba_objects ?
Показать ещё 1 комментарий
22
SELECT username FROM all_users ORDER BY username;
  • 0
    Очень полезно, если у вашего пользователя нет прав на dba_users (например, ошибка ORA-00942 : table or view does not exist )
  • 0
    но вывод один и тот же между dba_users и all_users?
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. С созданием отложенного сегмента возможно иметь объект без сегмента.
2

Как насчет:

SQL> select * from all_users;

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

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

Ниже в sql перечислены все схемы в оракуле, созданные после установки ORACLE_MAINTAINED = 'N' - фильтр. Этот столбец является новым в 12c.

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

Любой из следующих SQL вернет всю схему в Oracle DB.

  • select owner FROM all_tables group by owner;
  • select distinct owner FROM all_tables;
  • 0
    Могут быть схемы, в которых есть только не-табличные объекты, которые не будут перечислены в ваших запросах.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню