데이터베이스를 구축하는 절차는 다음과 그림과 같이 진행된다.
우리 회사(㈜Pro-Medical)는 서울에 본사를 두고 전국적으로 10개의 지사를 둔 의약 제품 중간 유통 업체다. 이번 시스템은 서울 본사와 서울 지사에 대해서 우선적으로 데이터베이스를 구축하고 나머지 지사에 대해서는 추후 시스템을 확장하도록 한다. 본사에서는 의약 제품을 납품하는 업체들로부터 제품을 납품 받아서 단가 및 재고를 관리한다. 또한 전국에서 일하는 부서와 사원은 본사에서 일괄 관리하며, 모든 일의 처리는 해당 사원들이 담당한다. 지사에서는 고객으로부터 주문을 받으면 본사에서 관리하는 제품을 이용하여 주문된 제품이 있다면 고객에게 배송한다. 이때 배송을 담당하는 업체는 별도로 존재하며 우리 시스템에서는 기본 데이터만 관리한다. 사원 정보와 제품 정보는 본사에서 관리되지만 빠른 처리를 위해서 지사에도 동일한 데이터를 위치 시키도록 한다. 회계 시스템에서는 주문 관리 시스템에 있는 사원 정보를 이용한다. 그러나 급여에 관련된 정보는 보여주지 않는다. |
시나리오에서 고려해야 할 사항 및 전제 사항
SPOOL ts_cre_bonsa.log
-- 테이블 스페이스(TS001)
CREATE TABLESPACE TS001
DATAFILE '/data/test/db1/DF001.DBF01' SIZE 55M
DEFAULT STORAGE (
INITIAL 1024K
NEXT 512K
MAXEXTENTS 128
PCTINCREASE 0
);
-- 인덱스 스페이스(IS001)
CREATE TABLESPACE IS001
DATAFILE '/data/test/db1/DF001.DBF02' SIZE 30M
DEFAULT STORAGE (
INITIAL 512K
NEXT 256K
MAXEXTENTS 128
PCTINCREASE 0
);
SPOOL OFF
SPOOL ts_cre_jisa.log
-- 테이블 스페이스(TS002)
CREATE TABLESPACE TS002
DATAFILE '/data1/test/db2/DF002.DBF01' SIZE 45M
DEFAULT STORAGE (
INITIAL 1024K
NEXT 64K
MAXEXTENTS 64
PCTINCREASE 0
);
-- 인덱스 스페이스(IS001)
CREATE TABLESPACE IS002
DATAFILE '/data1/test/db2/DF002.DBF02' SIZE 25M
DEFAULT STORAGE (
INITIAL 512K
NEXT 64K
MAXEXTENTS 64
PCTINCREASE 0
);
SPOOL OFF
SQL>@ts_cre_bonsa.sql
SQL>@ts_cre_jisa.sql
PROMPT =====================================
PROMPT 테이블 스페이스 확인 스크립트
PROMPT ====================================
COL TABLESPACE_NAME FORMAT A10
COL DATAFILE FORMAT A50
COL SZ_KB FORMAT 9,999,999
SELECT TABLESPACE_NAME,
FILE_NAME AS DATAFILE,
(BYTES/1024) AS SZ_KB
FROM DBA_DATA_FILES ;
- 실행결과
TABLESPACE DATAFILE SZ_KB
---------- -------------------------------------------------- ----------
TS001 /data/test/db1/DF001.DBF01 56,320
IS001 /data/test/db1/DF001.DBF02 30,720
TS002 /data1/test/db2/DF002.DBF01 46,080
IS002 /data1/test/db2/DF002.DBF02 25,600
SPOOL user_cre_bonsa.sql
CREATE USER BONSA01 IDENTIFIED BY BONSA01
DEFAULT TABLESPACE TS001
TEMPORARY TABLESPACE TEMP;
SPOOL OFF
SPOOL user_cre_jisa.sql
CREATE USER JISA01 IDENTIFIED BY JISA01
DEFAULT TABLESPACE TS002
TEMPORARY TABLESPACE TEMP;
SPOOL OFF
SQL>@user_cre_bonsa.sql
User created.
SQL>@user_cre_jisa.sql
User created.
# 사용자 생성 확인 및 실행 결과
PROMPT ====================================================
PROMPT 사용자 생성 확인 스크립트
PROMPT ====================================================
COL USERNAME FORMAT A15
COL DEF_TBS FORMAT A15
COL TMP_TBS FORMAT A15
- 실행 결과
USERNAME DEF_TBS TMP_TBS PROFILE
--------------- --------------- --------------- ------------------------------
BONSA01 TS001 TEMP DEFAULT
JISA01 TS002 TEMP DEFAULT
SPOOL role_cre_bonsa.sql
CREATE ROLE BONSA_ROLE NOT IDENTIFIED;
GRANT CREATE SESSION, CREATE TABLE,
CREATE VIEW,
ALTER ROLLBACK SEGMENT
TO BONSA_ROLE;
SPOOL OFF
SPOOL role_cre_jisa.log
CREATE ROLE JISA_ROLE NOT IDENTIFIED;
GRANT CREATE SESSION, CREATE TABLE,
CREATE VIEW,
ALTER ROLLBACK SEGMENT
TO JISA_ROLE;
SPOOL OFF
SQL>@role_cre_bonsa.sql
Role created.
Grant succeeded.
SQL>@role_cre_jisa.sql
Role created.
Grant succeeded.
PROMPT ====================================================
PROMPT 역할 생성 확인 스크립트
PROMPT ====================================================
COL ROLE FORMAT A35
SELECT ROLE FROM DBA_ROLES;
SQL>COL ROLE FORMAT A35
SQL>SELECT ROLE FROM DBA_ROLES;
ROLE
-----------------------------------
......
BONSA_ROLE
JISA_ROLE
SQL>GRANT BONSA_ROLE TO BONSA01 ;
Grant succeeded.
SQL>GRANT JISA_ROLE TO JISA01;
Grant succeeded.
PROMPT ====================================================
PROMPT 권한 부여 확인 스크립트
PROMPT ====================================================
COL GRANTEE FROMAT A10
COL GRANTED_ROLE FORMAT A30
SELECT GRANTEE,
GRANTED_ROLE
FROM DBA_ROLE_PRIVS ;
-- 실행 결과
GRANTEE GRANTED_ROLE
------------------------------ ------------------------------
......
BONSA01 BONSA_ROLE
JISA01 JISA_ROLE
SPOOL tab_cre_bonsa.sql
CREATE TABLE DEPT (
DEPTNO NUMBER(2) NOT NULL,
DEPTNM VARCHAR2(14) NOT NULL,
LOC VARCHAR2(14),
CHARGE VARCHAR2(20)
) TABLESPACE TS001
STORAGE ( INITIAL 1M
NEXT 1M
PCTINCREASE 0);
ALTER TABLE DEPT ADD CONSTRAINT DEPT_PK PRIMARY KEY(DEPTNO);
CREATE TABLE EMP (
EMPNO NUMBER(4) NOT NULL,
EMPNM VARCHAR2(14) NOT NULL,
JOB VARCHAR2(9) NULL,
HIREDATE DATE NULL,
SAL NUMBER(10,2) NULL,
DEPTNO NUMBER(2) NOT NULL
) TABLESPACE TS001
STORAGE ( INITIAL 1M
NEXT 1M
PCTINCREASE 0);
ALTER TABLE EMP ADD CONSTRAINT EMP_PK PRIMARY KEY(EMPNO) ;
CREATE TABLE SUPPLIER (
SUPNO NUMBER(4) NOT NULL,
SUPNM VARCHAR2(14) NOT NULL,
SUPADDR VARCHAR2(60) NOT NULL,
SUPPOST VARCHAR2(30) NULL,
SUPTEL VARCHAR2(20) NULL
) TABLESPACE TS001
STORAGE ( INITIAL 1M
NEXT 1M
PCTINCREASE 0);
ALTER TABLE SUPPLIER ADD CONSTRAINT SUP_PK PRIMARY KEY(SUPNO) ;
CREATE TABLE ITEM (
ITEMCD VARCHAR2(10) NOT NULL,
ITEMNM VARCHAR2(20) NOT NULL,
ITEMQTY NUMBER(10) NOT NULL,
IPRICE NUMBER(10) DEFAULT 0 NULL,
COLOR VARCHAR2(10) NULL,
MADEDATE DATE NULL,
SUPNM NUMBER(4) NOT NULL
) TABLESPACE TS001
STORAGE ( INITIAL 1M
NEXT 1M
PCTINCREASE 0);
ALTER TABLE ITEM ADD CONSTRAINT ITEM_PK PRIMARY KEY(ITEMCD) ;
-- FOREIGN KEY 지정
ALTER TABLE EMP ADD CONSTRAINT EMP_DEPT_FK01
FOREIGN KEY (DEPTNO) REFERENCES DEPT;
ALTER TABLE ITEM ADD CONSTRAINT DEPT_SUPPLIER_FK01
FOREIGN KEY (SUPNM) REFERENCES SUPLIER;
SPOOL OFF
SPOOL tab_cre_jisa.log
CREATE TABLE CUST (
CUSTNO NUMBER(4) NOT NULL,
CUSTNM VARCHAR2(14) NOT NULL,
CADDR VARCHAR2(60) NOT NULL,
CPOST VARCHAR2(30) NULL,
CTEL VARCHAR2(20) NULL,
CEMAIL VARCHAR2(40) NULL
) TABLESPACE TS002
STORAGE (INITIAL 1M
NEXT 1M
PCTINCREASE 0);
ALTER TABLE CUST ADD CONSTRAINT CUST_PK PRIMARY KEY(CUSTNO);
CREATE TABLE ORDER01 (
ORDERNO NUMBER(6) NOT NULL,
ORDERTYPE VARCHAR2(6) NOT NULL,
ORDERDATE DATE NOT NULL,
CUSTNO NUMBER(4) NOT NULL,
EMPNO NUMBER(4) NOT NULL,
DELIVNO NUMBER(4) NOT NULL
) TABLESPACE TS002
STORAGE (INITIAL 1M
NEXT 1M
PCTINCREASE 0);
ALTER TABLE ORDER01 ADD CONSTRAINT ORDER01_PK PRIMARY KEY(ORDERNO);
CREATE TABLE ORDERITEM (
ORDERNO NUMBER(6) NOT NULL,
ITEMCD VARCHAR2(10) NOT NULL,
ORDERQTY NUMBER(10) NOT NULL
) TABLESPACE TS002
STORAGE (INITIAL 1M
NEXT 1M
PCTINCREASE 0);
ALTER TABLE ORDERITEM ADD CONSTRAINT ORDERITEM_PK PRIMARY KEY(ORDERNO, ITEMCD);
CREATE TABLE DELIVERY (
DELIVNO NUMBER(4) NOT NULL,
DDATE DATE NOT NULL,
COMPNO NUMBER(4) NOT NULL
) TABLESPACE TS002
STORAGE (INITIAL 1M
NEXT 1M
PCTINCREASE 0);
ALTER TABLE DELIVERY ADD CONSTRAINT DELIVERY_PK PRIMARY KEY(DELIVNO);
-- FOREIGN KEY 지정
ALTER TABLE ORDER01 ADD CONSTRAINT ORDER_DELIVERY_FK01
FOREIGN KEY (DELIVNO) REFERENCES DELIVERY;
ALTER TABLE ORDER01 ADD CONSTRAINT ORDER_CUST_FK01
FOREIGN KEY (CUSTNO) REFERENCES CUST;
ALTER TABLE ORDER01 ADD CONSTRAINT ORDERITEM_ORDER_FK01
FOREIGN KEY (DELIVNO) REFERENCES ORDER01 ;
SPOOL OFF
SQL>@tab_cre_bonsa.sql
SQL>@tab_cre_jisa.sql
PROMPT ================================
PROMPT 테이블 생성 확인 스크립트
PROMPT ================================
SQL>COL SEGMENT_NAME FORMAT A15
SQL>COL TABLESPACE_NAME FORMAT A10
SQL>SELECT SEGMENT_NAME, ROUND(INITIAL_EXTENT/1024,0) INI_KB,
ROUND(NEXT_EXTENT/1024,0) NXT_KB, ROUND(BYTES/1024,0) TOT_KB,
PCT_INCREASE PCT, EXTENTS, TABLESPACE_NAME
FROM USER_SEGMENTS
WHERE SEGMENT_TYPE = 'TABLE'
AND TABLESPACE_NAME IN('TS001', 'TS002') ;
SEGMENT_NAME INI_KB NXT_KB TOT_KB PCT EXTENTS TABLESPACE
--------------- ---------- ---------- ---------- ---------- ---------- ----------
ITEM 1024 1024 16 TS001
SUPPLIER 1024 1024 16 TS001
EMP 1024 1024 16 TS001
DEPT 1024 1024 16 TS001
ORDERITEM 1024 1024 16 TS002
CUST 1024 1024 16 TS002
PROMPT ================================
PROMPT PRIMARY KEY 생성 확인 스크립트
PROMPT ================================
COL TABLE_NAME FORMAT A20
COL CONSTRAINT_NAME FORMAT A20
SQL>SELECT A.TABLE_NAME, B.CONSTRAINT_NAME
FROM USER_TABLES A, USER_CONSTRAINTS B
WHERE A.TABLE_NAME=B.TABLE_NAME(+)
AND B.CONSTRAINT_TYPE(+) = 'P'
AND TABLESPACE_NAME IN('TS001', 'TS002') ;
TABLE_NAME CONSTRAINT_NAME
-------------------- --------------------
ORDERITEM ORDERITEM_PK
CUST CUST_PK
ITEM ITEM_PK
SUPPLIER SUP_PK
EMP EMP_PK
DEPT DEPT_PK
PROMPT ================================
PROMPT PRIMARY KEY 생성 확인 스크립트
PROMPT ================================
SQL>COL CONSTRAINT_NAME FORMAT A20
SQL>COL R_CONSTRAINT_NAME FORMAT A20
SQL>SELECT CONSTRAINT_NAME, R_CONSTRAINT_NAME, STATUS
FROM USER_CONSTRAINTS
WHERE OWNER IN('BONSA01', 'JISA01');
CONSTRAINT_NAME R_CONSTRAINT_NAME STATUS
-------------------- -------------------- --------
DEPT_SUPPLIER_FK01 SUP_PK ENABLED
EMP_DEPT_FK01 DEPT_PK ENABLED
DEPT_PK ENABLED
EMP_PK ENABLED
SUP_PK ENABLED
ITEM_PK ENABLED
-- 본사 인덱스 생성
SPOOL index_cre_bonsa.log
CREATE INDEX I_EMP01 ON EMP (DEPTNO ASC) TABLESPACE IS001;
SPOOL OFF
-- 지사 인덱스 생성
SPOOL index_cre_jisa.log
CREATE INDEX I_ORDER01 ON ORDER01 (DATE ASC) TABLESPACE IS002;
CREATE INDEX I_ORDER02 ON ORDER01 (CUSTNO ASC) TABLESPACE IS002;
CREATE INDEX I_ORDER03 ON ORDER01 (EMPNO ASC) TABLESPACE IS002;
CREATE INDEX I_ITEM01 ON ITEM (SUPNO ASC) TABLESPACE IS002;
CREATE INDEX I_ITEM02 ON ITEM (MADEDATE ASC) TABLESPACE IS 002;
SPOOL OFF
BONSA =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521) ) )
(CONNECT_DATA =
(SERVICE_NAME = BONSA) ) )
SQL> CREATE PUBLIC DATABASE LINK H2U1
CONNECT TO BONSA01 IDENTIFIED BY BONSA01
USING 'BONSA'; <-- tnsnames.ora 에서 지정한 원격 데이터 베이스명
(1) 본사 환경 설정
CREATE SNAPSHOT LOG ON EMP
TABLESPACE TS001
STORAGE(INITIAL 1M NEXT 1M PCTINCREASE 0) ;
CREATE SNAPSHOT LOG ON ITEM
TABLESPACE TS001
STORAGE(INITIAL 1M NEXT 1M PCTINCREASE 0) ;
(2) 지사 환경 설정
CREATE SNAPSHOT LOG ON EMP
TABLESPACE TS002 STORAGE(INITIAL 1M NEXT 1M PCTINCREASE 0)
USING INDEX TABLESPACE IS002 STORAGE (MINEXTENTS 1 PCTINCREASE 0)
REFRESH FAST
START WITH SYSDATE NEXT TRUNC(SYSDATE) + 1 + (20/24) <-- REFRESH 주기
AS SELECT * FROM EMP@BONSA ; <-- 데이터베이스 링크명
CREATE SNAPSHOT ITEM
TABLESPACE TS002 STORAGE (MINEXTENTS 1 PCTINCREASE 0)
USING INDEX TABLESPACE IS002 STORAGE (MINEXTENTS 1 PCTINCREASE 0)
REFRESH FAST
START WITH SYSDATE NEXT TRUNC(SYSDATE) + 1 + (20/24) <-- REFRESH 주기
AS SELECT * FROM ITEM@GONSA ; <-- 데이터베이스 링크명