Как мне перечислить все таблицы в схеме в Oracle SQL?


Ответы:


220

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

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

или большой молот, роль DBA.

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

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]'

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

SELECT DISTINCT OBJECT_NAME 
  FROM USER_OBJECTS
 WHERE OBJECT_TYPE = 'TABLE'

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

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

1
В DISTINCTзапросе нет абсолютно никакой необходимости . owner, object_nameявляется уникальным вALL_OBJECTS
a_horse_with_no_name

1
Эти запросы не должны отличаться, это правда; однако, owner, object_nameне является уникальным в dba_objects; В этом представлении отображаются тела пакета и пакеты, а таблицы и индексы находятся в разных пространствах имен.
Адам Муш

Последний запрос не будет работать, как в XE 11.2. Кажется, в user_objects нет столбца «владелец».
Рафаэль Чавес

71
SELECT table_name  from all_tables where owner = 'YOURSCHEMA';

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

14

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

select TABLE_NAME from user_tables

5
Это все таблицы в ВАШЕЙ схеме, а не все таблицы в схеме. Кроме того, представления словаря данных * _TABLES (DBA_TABLES, ALL_TABLES, USER_TABLES) включают представления.
Адам Муш

замените «включить представления» на «можно включать представления в некоторых версиях Oracle».
Адам Муш

@ Adam Musch Протестировано с использованием Oracle 10g R2, оно не возвращало просмотров
Сатьяджит Бхат

4

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

select * from tab;

3

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

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

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

2

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

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

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

select TABLE_NAME from user_tables


2
select TABLE_NAME from user_tables;

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



1

ВЫБРАТЬ имя_таблицы, владелец FROM all_tables, где владелец = 'имя_схемы' упорядочено по имени_таблицы


1

Вы можете напрямую запустить второй запрос, если знаете имя владельца.

- Во-первых, вы можете выбрать, какие существуют все ВЛАДЕЛЬЦЫ:

SELECT DISTINCT(owner) from SYS.ALL_TABLES;

- Затем вы можете увидеть таблицы под этим владельцем:

SELECT table_name, owner from all_tables where owner like ('%XYZ%');


0

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

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


0

Имя таблицы и счетчик строк для всех таблиц в OWNERсхеме:

SELECT table_name, num_rows counter from DBA_TABLES WHERE owner = 'OWNER'

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.