Как я могу запрашивать только несистемные базы данных в соединении Oracle? - PullRequest
2 голосов
/ 08 марта 2019

Я хочу иметь возможность отображать список всех пользовательских баз данных в соединении Oracle, за исключением системных баз данных.

Существует способ различать пользовательские таблицы и системные таблицы в базе данных.Но я никак не мог найти способ отфильтровать все системные базы данных.

Кто-нибудь знает, как этого добиться?

Ответы [ 2 ]

2 голосов
/ 08 марта 2019

При подключении к oracle вы обычно подключаетесь к ОДНОЙ базе данных, и в этой базе данных у вас будет несколько схем.Эти схемы будут рассматриваться как «базы данных» в некоторых других системах rdbms.Каждая схема принадлежит пользователю БД, который может быть системным или обычным пользователем.Все таблицы / объекты, созданные в схеме, «принадлежат» владельцу схемы.

Таким образом, грубым методом отделения системных таблиц от пользовательских таблиц будет рассмотрение таблиц в схемах, принадлежащих системному пользователю, как системных таблиц.

Если в базе данных с версией 12c и выше вы можете сделать это следующим образом:

select t.table_name, t.owner, u.oracle_maintained
from dba_tables t, dba_users u 
where t.owner = u.username
 and rownum < 100;

Если версия ниже 12c, столбец oracle_maintained не существует, поэтому вам нужен этот обходной путь.Для 35 пользователей должно быть установлено наибольшее значение used_id.Пользователи системы обычно самые низкие в базе данных.

select t.table_name, t.owner, case when u.user_id > 35 then 'N' else 'Y' end systemgenerated
from dba_tables t, dba_users u 
where t.owner = u.username
 and rownum < 100;

Также: 'и rownum <100' должны быть заменены вашим собственным фильтром для таблиц. </p>

0 голосов
/ 12 марта 2019

Я мог бы найти точный ответ на мой вопрос, обратившись за помощью из другого поста - Oracle SQL Query для перечисления всех схем в БД

Вот запрос, который мне был нужен:

> SELECT * FROM dba_users u WHERE EXISTS (SELECT 1 FROM dba_objects o
> WHERE o.owner = u.username ) AND default_tablespace not in
> ('SYSTEM','SYSAUX') and ACCOUNT_STATUS = 'OPEN'

Будет выведен список всех несистемных пользователей / схем (или баз данных) из вашей базы данных. Убедитесь, что вы вошли в систему как пользователь SYS, или вы предоставляете «ВЫБРАТЬ ГРАНТ В ПОЛЕ dba_users ДЛЯ the_non_sys_user»

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...