1. SQL초보에서 Schema Objects까지
9. 데이터 딕셔너리(Data Dictionary)
9.1 데이터 딕셔너리 개요
오라클 데이터베이스 운영과 연관된 중요한 정보를 제공하는 읽기 전용 시스템 테이블, 뷰의 집
합이며 일반 사용자가 직접 수정하는 것은 불가능하며 오라클 서버에서 스스로 관리하는 영역이
고 소유자는 SYS 계정이다.
모든 스키마 오브젝트(테이블, 인덱스, 뷰, 시퀀스, 동의어, DB링크, PL/SQL 함수나 프로시저)의 정
의와 이 오브젝트에 대해 얼마나 많은 저장공간을 사용하는지, 칼럼의 기본값은 무엇이고 제약조
건은 어떤 것들이 있는지, 오라클 사용자의 이름, DB에 생성된 권한과 롤 등이 어떻게 부여 되었
는지, 객체접근 및 수정에 따른 시스템 감사정보, 데이터베이스 생성시각, 이름, 운영모드, 인스턴
스의 이름 등과 같이 DB운영에 필요한 중요한 정보들이 기록된다.
오라클은 사용자 정보 및 관련 스키마 오브젝트와 저장구조등에 접근하기 위해 데이터 딕셔너리
를 접근하고 사용자가 실행하는 DDL(Data Definition Language)에 맞추어 데이터 딕셔너리를 갱신
하고 모든 오라클 사용자는 이러한 정보를 읽기 전용 뷰를 통해 참조할 수 있다.
[읽기 전용 뷰의 접두어에 따른 데이터 딕셔너리 분류]
Prefix Access Scope
USER_ 사용자에서 생성한 객체 정보를 확인하는 뷰
ALL_ 사용자가 접근 가능한 객체정보를 확인하는 뷰
OWNER 칼럼이 있어 해당 객체의 소유자 확인 가능
DBA_ DB 관리자가 접근 가능한 뷰
Dictionary View
데이터베이스 사용자가 접근 가능한 딕셔너리뷰를 나열한다.
SQL>conn scott/tiger
SQL> set pagesize 200
SQL> desc dictionary
2. 이름 널? 유형
----------------------------------------- -------- ----------------------
TABLE_NAME VARCHAR2(30)
COMMENTS VARCHAR2(4000)
SQL> column comments format a40
SQL> select * from dictionary where table_name like 'USER_T%' and rownum < 10;
TABLE_NAME COMMENTS
------------------------------ ----------------------------------------
USER_TABLES Description of the user's own relational
tables
USER_TABLESPACES Description of accessible tablespaces
USER_TAB_COLS Columns of user's tables, views and clus
ters
USER_TAB_COLUMNS Columns of user's tables, views and clus
ters
USER_TAB_COL_STATISTICS Columns of user's tables, views and clus
ters
USER_TAB_COMMENTS Comments on the tables and views owned b
y the user
USER_TAB_HISTGRM_PENDING_STATS Pending statistics of tables, partitions
, and subpartitions
USER_TAB_HISTOGRAMS Histograms on columns of user's tables
USER_TAB_MODIFICATIONS Information regarding modifications to t
Ables
9.2 USER_ 데이터 딕셔너리 뷰
USER_CONSTRAINTS : 사용자가 작성한 제약조건을 확인 하는 뷰
USER_CONS_COLUMNS : 제약조건이 걸려 있는 칼럼을 확인 하는 뷰
3. --각각 뷰를 조회해도 되겠지만 아래처럼 두 뷰를 조인시켜 MYEMP1 테이블의 테이블의 제약조
건과 그 칼럼을 확인 할 수 있다.
SQL> column column_name format a10
SQL> column search_condition format a10
SQL> column constraint_name format a20
SQL> SELECT c2.column_name, c1.constraint_name,
c1.constraint_type, c1.search_condition,
c1.r_constraint_name
FROM user_constraints c1, user_cons_columns c2
WHERE c1.constraint_name = c2.constraint_name
AND c1.table_name = 'MYEMP1'
ORDER BY 1;
COLUMN_NAM CONSTRAINT_NAME C SEARCH_CON R_CONSTRAINT_NAME
---------- -------------------- - ---------- ----------------------------
DEPTNO FK_MYEMP1_MYDEPT1 R SYS_C0011474
EMPNO SYS_C0011472 P
USER_TABLES : 사용자가 작성한 테이블을 확인 하는 뷰, 칼럼구조는 ALL_TABLES 뷰와 동일하며
정확한 정보를 위해서 테이블의 통계정보가 생성되어야 한다.
USER_TAB_COLUMNS : 테이블, 뷰, 클러스터의 칼럼과 관련된 정보 조회용이며 정확한 정보를 위
해서는 테이블, 뷰의 통계정보가 생성 되어야한다.
--USER_TABLES 통해 MYEMP1 테이블의 테이블스페이스 및 레코드건수, 몇 개의 BLOCK으로 이
루어 졌는지, 평균 ROW SIZE, 최근 통계정보 생성일자를 조회하라.
SQL> select tablespace_name, num_rows, blocks, last_analyzed
from user_tables where table_name = 'MYEMP1';
TABLESPACE_NAME NUM_ROWS BLOCKS LAST_ANA
------------------------------ ---------- ---------- --------
USERS 20000004 160378 14/09/07
-- USER_TABLES 뷰에서 테이블의 이름을 추출하여 SCOTT 계정의 모든 테이블 삭제 스크립트를
생성하라.
SQL>conn scott/tiger;
SQL> SELECT 'DROP TABLE ' || table_name ||
' CASCADE CONSTRAINTS; '
FROM user_tables;
4. 'DROPTABLE'||TABLE_NAME||'CASCADECONSTRAINTS;'
--------------------------------------------------------
DROP TABLE S_CUSTOMER CASCADE CONSTRAINTS;
DROP TABLE S_DEPT CASCADE CONSTRAINTS;
DROP TABLE S_ORD CASCADE CONSTRAINTS;
DROP TABLE S_PRODUCT CASCADE CONSTRAINTS;
……
-- USER_TABLES 뷰를 이용하여 SCOTT 사용자에게 현재사용자의 모든 테이블에 대한 SELECT권
한을 부여 하는 스크립트를 작성하세요.
SQL> SELECT 'GRANT SELECT ON ' || table_name || ' to scott;' FROM user_tables;
GRANT SELECT ON DEPT to scott;
GRANT SELECT ON EMP to scott;
GRANT SELECT ON MYDEPT1 to scott;
GRANT SELECT ON MYEMP1 to scott;
……
USER_OBJECTS : 사용자가 작성한 스키마 오브젝트(테이블, 인덱스, 뷰, 시퀀스, DB링크, PLSQL 함
수, 프러시저)를 확인 하는 뷰, 칼럼구조는 ALL_OBJECTS 뷰와 동일하다.
USER_OBJECT_SIZE : 사용자가 작성한 PLSQL 오브젝트(PLSQL 함수, 프러시저, 패키지)의 바이트
단위 사이즈를 조회한다.
--USER_OBJECTS 뷰에서 OBJECT 타입별로 OBJECT이름을 나열하시오.
SQL> column object_name format a40
SQL> select object_type, object_name from user_objects
group by object_type, object_name
order by object_type;
OBJECT_TYPE OBJECT_NAME
------------------- ----------------------------------------
FUNCTION GETEMP
INDEX IDX_EMPTEST_DEPTNO
INDEX IDX_EMP_SAL
INDEX IDX_MYEMP1_ENAME
……
TABLE ADDRBOOK1
5. TABLE ADDRBOOK2
……
--SCOTT계정의 모든 OBJECT에 대해 ONJ 라는 계정에 대해 권한을 주려하려 한다. 스크립트를
텍스트 파일로 생성하시오. (테이블이면 SELECT, INSERT, UPDATE, DELETE 권한을, 시퀀스/뷰 라
면 SELECT 권한을, 패키지/프러시저/함수라면 실행 권한을 부여하려 한다.)
-- 아래와 같이 딕셔너리 뷰등을 잘 활용하면 다양한 스크립트를 생성할 수 있다.
SQL> set pagesize 0
SQL> define OWNER=SCOTT
SQL> define NEWUSER=ONJ
SQL> spool grant_script.sql
SQL> SELECT
decode(OBJECT_TYPE,
'TABLE','GRANT SELECT, INSERT, UPDATE, DELETE , REFERENCES ON '||'&OWNER'||'.',
'VIEW','GRANT SELECT ON '||'&OWNER'||'.',
'SEQUENCE','GRANT SELECT ON '||'&OWNER'||'.',
'PROCEDURE','GRANT EXECUTE ON '||'&OWNER'||'.',
'PACKAGE','GRANT EXECUTE ON '||'&OWNER'||'.',
'FUNCTION','GRANT EXECUTE ON '||'&OWNER'||'.' )||object_name||' TO &NewUser;'
FROM USER_OBJECTS where OBJECT_TYPE IN ( 'TABLE', 'VIEW', 'SEQUENCE', 'PROCEDURE',
'PACKAGE', 'FUNCTION’)
ORDER BY OBJECT_TYPE;
구 3: 'TABLE','GRANT SELECT, INSERT, UPDATE, DELETE , REFERENCES ON '||'&OWNER'||'.',
신 3: 'TABLE','GRANT SELECT, INSERT, UPDATE, DELETE , REFERENCES ON '||'SCOTT'||'.',
구 4: 'VIEW','GRANT SELECT ON '||'&OWNER'||'.',
신 4: 'VIEW','GRANT SELECT ON '||'SCOTT'||'.',
구 5: 'SEQUENCE','GRANT SELECT ON '||'&OWNER'||'.',
신 5: 'SEQUENCE','GRANT SELECT ON '||'SCOTT'||'.',
구 6: 'PROCEDURE','GRANT EXECUTE ON '||'&OWNER'||'.',
신 6: 'PROCEDURE','GRANT EXECUTE ON '||'SCOTT'||'.',
구 7: 'PACKAGE','GRANT EXECUTE ON '||'&OWNER'||'.',
신 7: 'PACKAGE','GRANT EXECUTE ON '||'SCOTT'||'.',
구 8: 'FUNCTION','GRANT EXECUTE ON '||'&OWNER'||'.' )||object_name||' TO &NewUser;'
신 8: 'FUNCTION','GRANT EXECUTE ON '||'SCOTT'||'.' )||object_name||' TO ONJ;'
GRANT EXECUTE ON SCOTT.GETEMP TO ONJ;
GRANT EXECUTE ON SCOTT.COMM_PACKAGE TO ONJ;
GRANT SELECT ON SCOTT.S_LONGTEXT_ID TO ONJ;
6. ……
GRANT SELECT, INSERT, UPDATE, DELETE , REFERENCES ON SCOTT.EMP_SUMMARY TO ONJ;
GRANT SELECT, INSERT, UPDATE, DELETE , REFERENCES ON SCOTT.EMP20 TO ONJ;
……
51 개의 행이 선택되었습니다.
SQL> host
Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.
C:Documents and SettingsA>dir
C 드라이브의 볼륨에는 이름이 없습니다.
볼륨 일련 번호: 1CBD-FB79
C:Documents and SettingsA 디렉터리
2014-09-11 오후 02:06 5,564 grant_script.sql
……
--USER_TAB_COLUMNS 뷰를 이용하여 EMP 테이블의 칼럼구조를 확인하라
SQL> column data_type format a12
SQL> SELECT table_name, column_name, data_type, data_length
FROM USER_TAB_COLUMNS
WHERE table_name = 'EMP'
ORDER BY column_id;
TABLE_NAME COLUMN_NAM DATA_TYPE DATA_LENGTH
---------- ---------- ------------ -----------
EMP EMPNO NUMBER 22
EMP ENAME VARCHAR2 10
EMP JOB VARCHAR2 9
EMP MGR NUMBER 22
EMP HIREDATE DATE 7
EMP SAL NUMBER 22
EMP COMM NUMBER 22
EMP DEPTNO NUMBER 22
EMP KEY NUMBER 22
7. 9 개의 행이 선택되었습니다.
--사용자가 작성한 함수, 프러시저, 패키지의 SIZE를 조회하시오.
--CODE_SIZE는 실행시 메모리에 있는 코드의 길이이며, ERROR_SIZE는 에러메시지의 길이
SQL> select * from user_object_size
where type in ('PROCEDURE','FUNCTION','PACKAGE','PACKAGE BODY');
NAME TYPE SOURCE_SIZE PARSED_SIZE CODE_SIZE ERROR_SIZE
------------ ------------------ ----------- ----------- ---------- ----------
COMM_PACKAGE PACKAGE 72 327 157 0
MYTAX PACKAGE 133 416 153 0
TYPES PACKAGE 50 229 86 0
COMM_PACKAGE PACKAGE BODY 518 295 767 0
GETEMP FUNCTION 286 927 482 0
MYTAX PACKAGE BODY 137 103 232 0
6 개의 행이 선택되었습니다.
USER_CATALOG : 사용자가 생성한 객체들을 간단히 이름, 종류만 나열한다.
SQL> desc user_catalog
이름 널? 유형
----------------------------------------- -------- ----------------------------
TABLE_NAME NOT NULL VARCHAR2(30)
TABLE_TYPE VARCHAR2(11)
SQL> select table_name from user_catalog where table_type = 'TABLE';
T1
S_WAREHOUSE
S_TITLE
S_REGION
S_PRODUCT
S_ORD
S_LONGTEXT
……
USER_INDEXES : 사용자가 작성한 인덱스를 조회한다.
8. USER_IND_COLUMNS : 인덱스 구성 칼럼을 조회한다.
--MYEMP1 테이블에 생성된 인덱스를 조회하라.
SQL> select INDEX_NAME, TABLE_NAME, VISIBILITY from user_indexes
where table_name = 'MYEMP1';
INDEX_NAME TABLE_NAME VISIBILIT
------------------------------ ------------------------------ ---------
IDX_MYEMP1_ENAME MYEMP1 VISIBLE
IDX_MYEMP1_DEPTNO MYEMP1 VISIBLE
SYS_C0011472 MYEMP1 VISIBLE
IDX_MYEMP1_SAL MYEMP1 INVISIBLE
--EMP, MYEMP1 테이블의 인덱스와 인덱스 칼럼을 조회하시오.
SQL> column table_name format a10
SQL> select table_name
, index_name
, i.uniqueness as unq
, i.status
, ic.column_name
from user_indexes i join
user_ind_columns ic using (table_name,index_name)
where table_name in ('EMP','MYEMP1')
order by table_name
, index_name
, unq
, ic.column_position;
TABLE_NAME INDEX_NAME UNQ STATUS COLUMN_NAM
---------- ------------------------------ --------- -------- ----------
EMP IDX_EMP_SAL NONUNIQUE VALID SAL
EMP PK_EMP UNIQUE VALID EMPNO
MYEMP1 IDX_MYEMP1_DEPTNO NONUNIQUE VALID DEPTNO
MYEMP1 IDX_MYEMP1_ENAME NONUNIQUE VALID ENAME
MYEMP1 IDX_MYEMP1_SAL NONUNIQUE VALID SAL
MYEMP1 SYS_C0011472 UNIQUE VALID EMPNO
6 개의 행이 선택되었습니다.