Як перерахувати всі таблиці на схемі в 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]'

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

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 або керується користувачем з привілеями, згаданими Адамом Мушем. В іншому випадку він просто показує таблиці у ВАШОМУ, до яких ми отримали пільги.
APC

14

Ви можете запитувати USER_TABLES

select TABLE_NAME from user_tables

5
Ось і всі таблиці вашої схеми, а не всі таблиці схеми A. Також перегляди словника даних _ _TABLES (DBA_TABLES, ALL_TABLES, USER_TABLES) містять представлення даних.
Адам Муш

замінити "включити перегляди" на "може включати перегляди у роздільні версії Oracle."
Адам Муш

@Adam Musch Випробуваний за допомогою Oracle 10g R2, він не повертав перегляди.
Сатьядхіт Бхат

4

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

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.
Kibbee

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, де owner = 'schema_name' упорядковується по імені table_name


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.