2010-02-11 1 views

ответ

166

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

SELECT ANY DICTIONARY 
(SELECT | INSERT | UPDATE | DELETE) ANY TABLE 

или большой молот, АБД роль.

С любой из них, вы можете выбрать:

SELECT DISTINCT OWNER, OBJECT_NAME 
    FROM DBA_OBJECTS 
WHERE OBJECT_TYPE = 'TABLE' 
    AND OWNER = '[some other schema]' 

Без этих системных привилегий, вы можете видеть только таблицы, которые вы получили некоторый уровень доступа к ним, либо непосредственно, либо через роль.

SELECT DISTINCT OWNER, OBJECT_NAME 
    FROM ALL_OBJECTS 
WHERE OBJECT_TYPE = 'TABLE' 
    AND OWNER = '[some other schema]' 

Наконец, вы всегда можете запросить словарь данных для собственных таблиц, так как ваши права на ваши таблицы не могут быть отменены (по 10 г):

SELECT DISTINCT OBJECT_NAME 
    FROM USER_OBJECTS 
WHERE OBJECT_TYPE = 'TABLE' 
+2

«самый полный ответ», кроме использования '% _OBJECTS' вместо'% _TABLES'. – APC

+0

Я помню, в 9i, что представления будут перечислены в% _TABLES - так, например, попытка автоматизировать опорожнение схемы приведет к появлению таких выражений, как DROP TABLE REALLY_A_VIEW CASCADE CONSTRAINTS. Таким образом, вам придется либо удалить представления с помощью MINUS/NOT IN/NOT EXISTS, либо перейти снова на% _OBJECTS. Плюс, против% _OBJECTS оставляет мучительный намек на то, что еще может быть там! –

+1

В запросе абсолютно нет необходимости в 'DISTINCT'. 'owner, object_name' уникален в' ALL_OBJECTS' –

11

Вы можете запросить USER_TABLES

select TABLE_NAME from user_tables 
+4

Это все таблицы в ВАШЕЙ схеме, а не все таблицы в схеме A. Кроме того, в представлениях словаря данных * _TABLES (DBA_TABLES, ALL_TABLES, USER_TABLES) есть представления. –

+0

заменить «include views» на «может включать в себя версии в версиях Oracle версии». –

+0

@ Adam Musch Протестировано с использованием Oracle 10g R2, оно не возвратило представления. – Sathya

3

Попробуйте заменить? с именем схемы

select TABLE_NAME from INFORMATION_SCHEMA.TABLES 
WHERE TABLE_SCHEMA =? 
    AND TABLE_TYPE = 'BASE TABLE' 
+1

Это больше агностик базы данных, и поэтому я думаю, что этот тип решения лучше по сравнению со всеми альтернативами. Я думаю, что INFORMATION_SCHEMA работает практически со всеми основными базами данных, которые я видел. Хотя некоторые отличаются тем, какую информацию вы можете получить, по крайней мере, это постоянное место для поиска. Однако из-за быстрого поиска в Интернете кажется, что Oracle - это единственная база данных, которая не поддерживает Information_Schema, хотя она является частью стандарта SQL-92. – Kibbee

+5

Конечно, OP специально запросил решение Oracle ... – DCookie

52
SELECT table_name from all_tables where owner = 'YOURSCHEMA'; 
+4

Schemanaame должно быть в UPPERCASE –

+2

Это будет отображаться только * все * таблицы в YOURSCHEMA, если они будут выполняться YOURSCHEMA или управляться пользователем с привилегиями, упомянутыми Адамом Мушем. В противном случае он просто показывает таблицы в YOURSCHEMA, которым мы получили привилегии. – APC

2

Если вы обращаетесь к Oracle с JDBC (Java), вы можете использовать DatabaseMetadata класс. Если вы обращаетесь к Oracle с помощью ADO.NET, вы можете использовать аналогичный подход.

Если вы обращаетесь к Oracle с ODBC, вы можете использовать функцию SQLTables.

В противном случае, если вам просто нужна информация в SQLPlus или аналогичном клиенте Oracle, один из указанных выше вопросов будет выполнен. Например:

select TABLE_NAME from user_tables 
4

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

select * from tab; 
1
select * from cat; 

он покажет все таблицы в схеме кошки синоним user_catalog

0
select TABLE_NAME from user_tables; 

Выше запроса даст вам имена всех таблиц, присутствующих в этом пользователе;

2
select * from user_tables; 

(показывая все таблицы)

0

Если вам нужно, чтобы получить размер таблицы, а также, это будет удобно:

select SEGMENT_NAME, PARTITION_NAME, BYTES from user_segments where SEGMENT_TYPE='TABLE' order by 1

1

ВЫБЕРИТЕ table_name, владелец ОТ ALL_TABLES где owner = 'schema_name' order by table_name