USER_, ALL_, DBA_ 뷰로 데이터베이스 구조 확인하기
테이블이나 인덱스가 실제로 어떤 이름으로 만들어졌는지, 현재 계정에서 조회할 수 있는지 확인해야 할 때가 있다. 예전에는 데이터 딕셔너리를 “테이블과 사용자 정보를 보관하는 곳” 정도로 짧게 적어 두었다. 실무에서 다시 찾기 쉽도록, 어떤 접두사의 뷰부터 조회할지와 권한 범위를 함께 정리했다.
Oracle 데이터 딕셔너리는 스키마 객체, 컬럼, 제약 조건, 권한 같은 메타데이터를 읽기 전용 뷰로 제공한다. 내부 기본 테이블을 직접 수정하는 대상이 아니다. 데이터베이스가 사용하는 기준 정보를 바꾸려 하지 말고, 목적에 맞는 딕셔너리 뷰를 조회해야 한다.
내 계정에서 볼 수 있는 범위를 먼저 선택
뷰 이름의 접두사는 조회 관점을 알려준다.
| 접두사 | 조회 범위 | 주로 확인할 때 |
|---|---|---|
USER_ | 현재 사용자가 소유한 객체 | 내 스키마의 테이블·컬럼·인덱스 |
ALL_ | 현재 사용자에게 권한이 있는 객체 | 다른 스키마에서 접근 가능한 객체 |
DBA_ | 데이터베이스 전반의 객체 | 관리자 점검과 전체 목록 |
일반 개발 계정으로 DBA_ 뷰를 조회할 수 있다고 가정하면 안 된다. 조회 권한이 부족하면 필요한 항목을 DBA에게 요청하거나 ALL_ 뷰로 현재 계정이 접근 가능한 범위부터 확인한다.
내 스키마 테이블과 컬럼 구조는 다음처럼 살펴볼 수 있다.
SELECT table_name
FROM user_tables
ORDER BY table_name;
SELECT column_name, data_type, data_length, nullable
FROM user_tab_columns
WHERE table_name = UPPER(:table_name)
ORDER BY column_id;
인덱스 컬럼 순서를 확인할 때는 인덱스별 위치도 함께 조회한다.
SELECT index_name, column_name, column_position
FROM user_ind_columns
WHERE table_name = UPPER(:table_name)
ORDER BY index_name, column_position;
다른 스키마의 테이블을 확인하려면 권한이 있는 범위에서 ALL_TAB_COLUMNS와 OWNER 조건을 사용한다. 이름이 정확히 기억나지 않을 때는 DICTIONARY 뷰에서 딕셔너리 뷰 이름과 간단한 설명을 찾아볼 수 있다.
V$는 객체 목록이 아니라 현재 상태를 보는 창
USER_, ALL_, DBA_가 주로 데이터베이스 객체와 권한의 메타데이터를 보여 준다면, V$ 뷰는 데이터베이스가 열려 작동하는 동안 세션, 메모리, SQL 실행 등의 동적 상태를 보여 준다. 따라서 두 종류를 같은 목록으로 생각하지 않는 편이 좋다.
예를 들어 V$SESSION은 세션 상태 확인에, V$SQL은 공유 SQL 영역에 남아 있는 커서 정보 확인에 쓰인다. 이런 뷰는 관리자 권한이 필요한 경우가 있다. Oracle RAC에서는 대응하는 GV$ 뷰가 여러 적격 인스턴스의 정보를 제공할 수 있으므로, 단일 인스턴스의 V$와 결과 범위가 다르다.
오브젝트가 없다는 오류가 나면 이름이 맞는지만 확인하지 말고 현재 접속 계정, 스키마 소유자, 부여된 권한, 접속한 PDB까지 같이 확인한다. 권한 문제를 확인하려고 개발 계정에 DBA 권한을 넓게 주는 것은 해결책이 아니다. 필요한 객체와 작업에 맞춰 최소 권한을 요청한다.
Oracle 문서는 접두사별 범위와 동적 성능 뷰를 데이터 딕셔너리 및 동적 성능 뷰 안내에서 설명한다. 이 조회 결과를 실행 계획 확인에 연결하는 방법은 Oracle 옵티마이저 실행 계획 정리에 이어 적었다.
처음에는 DBA_가 가장 많은 정보를 보여주니 편하다고 느낄 수 있다. 그러나 장애를 좁힐 때는 현재 접속 계정에서 실제로 접근 가능한 USER_ 또는 ALL_부터 확인하면 불필요한 권한 요청 없이도 구조를 빠르게 파악할 수 있다.
참고 문서: Oracle 데이터 딕셔너리와 동적 성능 뷰, Oracle 동적 성능 뷰 참고
당시 기록: Dictionary