Запит Oracle SQL для переліку всіх схем у БД


96

Я хотів видалити кілька невикористаних схем у нашій БД Oracle.

Як я можу запитувати всі назви схем?


1
Яке ваше визначення поняття "невикористаний"?
APC

Я працюю над проектом переселення даних, і кожен розробник має свій набір схем. (Деякі розробники вийшли, а деякі набори схем більше не використовуються).
vicsz

Відповіді:


130

Використання sqlplus

sqlplus / як sysdba

запустити:

ВИБІР * 
ВІД dba_users

Якщо ви хочете лише, щоб імена користувачів виконували наступне:

ВИБІРТЕ ім’я користувача 
ВІД dba_users

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) запит.
Карл

1
Чим це відрізняється від select distinct owner from dba_objects?
Dawood ibn Kareem

1
Щодо чистого екземпляра Oracle, ваш запит @David дає додаткового власника PUBLIC
захоплюючись

28
SELECT username FROM all_users ORDER BY username;

2
Дуже корисно, якщо ваш користувач не має привілеїв на dba_users(наприклад: помилка ORA-00942 : table or view does not exist)
Діней

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

Наскільки я розумію, цей запит відобразить усі схеми, що містять будь-які таблиці. Це так?
Ендрю Спенсер,

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

3

Нижче sql перелічує всі схеми в оракулі, створені після встановлення. ORACLE_MAINTAINED = 'N' - це фільтр. Цей стовпець новий у 12с.

вибрати окреме ім’я користувача, ORACLE_MAINTAINED з dba_users, де ORACLE_MAINTAINED = 'N';

1

Будь-який із наступних SQL поверне всі схеми в БД Oracle.

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

1
Можливо, існують схеми, у яких є лише нетабличні об’єкти, яких ваші запити не перелічують.
Matthew McPeak
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.