Oracle/Administration2012. 5. 22. 18:13

CHECK 제약조건 적용 사례를 살펴보자.

 

테스트를 위해 아래와 같이 테이블을 생성하자. 테이블에는 기간별 데이터가 저장된다. 주별은 주의 일요일, 월별, 분기별, 연별은 각각의 말일자로 dt 값을 저장해야 한다.

-- 1
DROP TABLE t1 PURGE;

CREATE TABLE t1 (
    cd VARCHAR2(1) -- 코드
  , tm VARCHAR2(1) -- 기간 (D, W, M, Q, Y)
  , dt VARCHAR2(8) -- 일자
  , vl NUMBER      -- 값
  , CONSTRAINT t1_pk PRIMARY KEY (cd, tm, dt));

아래의 CHECK 제약조건을 추가하자. 

-- 2
ALTER TABLE t1 ADD CONSTRAINT t1_cd CHECK (dt =
    CASE tm
        WHEN 'D' THEN TO_CHAR (TO_DATE (dt, 'YYYYMMDD'), 'YYYYMMDD')
        WHEN 'W' THEN TO_CHAR (NEXT_DAY (TO_DATE (dt, 'YYYYMMDD') - 1, 1), 'YYYYMMDD')
        WHEN 'M' THEN TO_CHAR (LAST_DAY (TO_DATE (dt, 'YYYYMMDD')), 'YYYYMMDD')
        WHEN 'Q' THEN TO_CHAR (TRUNC (ADD_MONTHS (TO_DATE (dt, 'YYYYMMDD'),  3), 'Q') - 1, 'YYYYMMDD')
        WHEN 'Y' THEN TO_CHAR (TRUNC (ADD_MONTHS (TO_DATE (dt, 'YYYYMMDD'), 12), 'Y') - 1, 'YYYYMMDD')
    END);

 

아래 쿼리를 실행하면 2행은 "ORA-01847: 달의 날짜는 1에서 말일 사이어야 합니다", 3~6행은 "ORA-02290: 체크 제약조건(T1_C1)이 위배되었습니다" 에러가 발생한다.

-- 3
INSERT INTO t1 VALUES ('A', 'D', '20500500', 1); -- ORA-01847
INSERT INTO t1 VALUES ('A', 'W', '20500503', 2); -- ORA-02290
INSERT INTO t1 VALUES ('A', 'M', '20500530', 3); -- ORA-02290
INSERT INTO t1 VALUES ('A', 'Q', '20500531', 4); -- ORA-02290
INSERT INTO t1 VALUES ('A', 'Y', '20500531', 5); -- ORA-02290
INSERT INTO t1 VALUES ('A', 'D', '20500501', 1);
INSERT INTO t1 VALUES ('A', 'W', '20500504', 2);
INSERT INTO t1 VALUES ('A', 'M', '20500531', 3);
INSERT INTO t1 VALUES ('A', 'Q', '20500630', 4);
INSERT INTO t1 VALUES ('A', 'Y', '20501231', 5);
COMMIT;

 

아래는 t1 테이블을 조회한 결과다.

-- 4
SELECT * FROM t1;

C1  C2 C3       C4
--  -- -------- --
B   D  20500501  1
B   W  20500504  2
B   M  20500531  3
B   Q  20500630  4
B   Y  20501231  5

5 rows selected.

 

10.1 이전 버전은 조회시 CHECK 제약조건을 필터 조건으로 사용하기 때문에 쿼리의 성능이 저하될 수 있다. 아래처럼 세션 설정하면 필터링을 회피할 수 있다. 

-- 5
ALTER SESSION SET EVENTS '10195 trace name context forever, level 1';


'Oracle > Administration' 카테고리의 다른 글

세션 정보 변경  (0) 2012.06.25
EDITIONING 뷰 테스트  (0) 2012.05.31
PK 제약조건과 인덱스 #1  (0) 2012.05.18
RANGE 파티션 통계정보 관리 패키지  (0) 2012.05.10
INVISIBLE 인덱스  (0) 2012.05.02
Posted by 정희락_