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에 대항하면 거기에 무엇이 있을지에 대한 힌트를 얻을 수 있습니다!
Adam Musch

1
DISTINCT쿼리에서에 대한 필요는 전혀 없습니다 . owner, object_nameALL_OBJECTS
a_horse_with_no_name

1
이러한 쿼리는 고유 할 필요가 없습니다. 사실입니다. 그러나 owner, object_namedba_objects에서 어떤 방식으로도 고유하지는 않습니다. 패키지 본문과 패키지는 모두 해당보기에 나타나고 테이블과 인덱스는 서로 다른 네임 스페이스에 있습니다.
Adam Musch

마지막 쿼리는 XE 11.2에서와 같이 작동하지 않습니다. 'user_objects'에는 '소유자'열이 없습니다.
Rafael Chaves

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

2
이것은 YOURSCHEMA에 의해 실행되거나 Adam Musch가 언급 한 권한을 가진 사용자가 실행하는 경우 YOURSCHEMA의 모든 테이블 만 표시 합니다 . 그렇지 않으면 권한이 부여 된 YOURSCHEMA의 테이블 만 표시합니다.
APC

14

당신은 쿼리 할 수 ​​있습니다 USER_TABLES

select TABLE_NAME from user_tables

5
이것이 스키마의 모든 테이블이 아니라 스키마의 모든 테이블입니다. 또한 * _TABLES 데이터 사전 뷰 (DBA_TABLES, ALL_TABLES, USER_TABLES)에는 뷰가 포함됩니다.
Adam Musch

"include views"를 "seme 버전의 Oracle에 view를 포함 할 수 있습니다"로 바꿉니다.
Adam Musch

@Adam Musch Oracle 10g R2를 사용하여 테스트했지만 뷰를 반환하지 않았습니다.
Sathyajith Bhat

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은 SQL-92 표준의 일부인 경우에도 Information_Schema를 지원하지 않는 유일한 데이터베이스 인 것으로 보입니다.
Kibbee

2

JDBC (Java)로 Oracle에 액세스하는 경우 DatabaseMetadata 클래스를 사용할 수 있습니다 . ADO.NET을 사용하여 Oracle에 액세스하는 경우 비슷한 방법을 사용할 수 있습니다.

ODBC로 Oracle에 액세스하는 경우 SQLTables 함수를 사용할 수 있습니다 .

그렇지 않으면 SQLPlus 또는 유사한 Oracle 클라이언트의 정보 만 필요한 경우 이미 언급 한 쿼리 중 하나가 수행합니다. 예를 들어 :

select TABLE_NAME from user_tables


2
select TABLE_NAME from user_tables;

위의 쿼리는 해당 사용자에 존재하는 모든 테이블의 이름을 제공합니다.


2
select * from user_tables;

(모든 테이블 표시)


1

SELECT table_name, table_name에 의한 owner = 'schema_name'순서의 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'

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.