Chciałem usunąć niektóre nieużywane schematy z naszej bazy danych Oracle.
Jak mogę zapytać o wszystkie nazwy schematów?
Chciałem usunąć niektóre nieużywane schematy z naszej bazy danych Oracle.
Jak mogę zapytać o wszystkie nazwy schematów?
Odpowiedzi:
Korzystanie z sqlplus
sqlplus / jako sysdba
biegać:
WYBIERZ * OD dba_users
Jeśli chcesz, aby nazwy użytkowników były tylko następujące:
WYBIERZ nazwę użytkownika OD dba_users
Najprawdopodobniej chcesz
SELECT username
FROM dba_users
To pokaże Ci wszystkich użytkowników w systemie (a tym samym wszystkie potencjalne schematy). Jeśli Twoja definicja „schematu” pozwala, aby schemat był pusty, tego właśnie chcesz. Jednak może istnieć rozróżnienie semantyczne, w którym ludzie chcą nazywać coś schematem tylko wtedy, gdy faktycznie jest właścicielem co najmniej jednego obiektu, więc setki kont użytkowników, które nigdy nie będą posiadać żadnych obiektów, zostaną wykluczone. W tym wypadku
SELECT username
FROM dba_users u
WHERE EXISTS (
SELECT 1
FROM dba_objects o
WHERE o.owner = u.username )
Zakładając, że ktokolwiek stworzył schematy był rozsądny w przypisywaniu domyślnych obszarów tabel i zakładając, że nie jesteś zainteresowany schematami dostarczonymi przez Oracle, możesz odfiltrować te schematy, dodając predykaty na default_tablespace
, tj.
SELECT username
FROM dba_users
WHERE default_tablespace not in ('SYSTEM','SYSAUX')
lub
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')
Nierzadko zdarza się jednak natknąć się na system, w którym ktoś niepoprawnie dał użytkownikowi niesystemowemu wartość default_tablespace
of SYSTEM
, więc upewnij się, że założenia są prawdziwe , zanim spróbujesz odfiltrować schematy dostarczone przez Oracle w ten sposób.
select distinct owner from dba_objects
?
SELECT username FROM all_users ORDER BY username;
dba_users
(np. Błąd ORA-00942 : table or view does not exist
)
select distinct owner
from dba_segments
where owner in (select username from dba_users where default_tablespace not in ('SYSTEM','SYSAUX'));
Co powiesz na :
SQL> select * from all_users;
zwróci listę wszystkich użytkowników / schematów, ich ID i datę utworzenia w DB:
USERNAME USER_ID CREATED
------------------------------ ---------- ---------
SCHEMA1 120 09-SEP-15
SCHEMA2 119 09-SEP-15
SCHEMA3 118 09-SEP-15
Poniżej sql zawiera listę wszystkich schematów w Oracle, które są tworzone po instalacji ORACLE_MAINTAINED = 'N' to filtr. Ta kolumna jest nowa w 12c.
wybierz odrębną nazwę użytkownika, ORACLE_MAINTAINED z dba_users, gdzie ORACLE_MAINTAINED = 'N';
Każda z poniższych instrukcji SQL zwróci cały schemat w bazie danych Oracle.
select owner FROM all_tables group by owner;
select distinct owner FROM all_tables;