2009년 5월 19일 화요일

DISABLE VALIDATE CONSTRAINT STATE

제품 : SQL*PLUS

작성날짜 : 2001-04-17

DISABLE VALIDATE CONSTRAINT STATE
=================================

오라클8i 이전 버전에서는 integrity constraints 가 아래의 세가지
상태를 가질 수 있었다.

1. ENABLE VALIDATE

테이블의 기존의 데이터는 물론 새로운 데이터들도 constraint 의
규칙에 따르게 되어 모든 테이블 데이터가 계속 valid 함을 보장한다.

2. ENABLE NOVALIDATE

테이블의 기존 데이터가 constraint 의 규칙에 따른다는 것을 보장하지
않으며 새로운 DML 작업에 의한 데이터에 대해서만 데이터의 valid 함을
보장한다.

3. DISABLE

오라클은 테이블의 integrity constraint 를 완전히 무시하며 데이터의
valid 함을 전혀 보장하지 않는다.

그러나, 오라클8i 부터는 DISABLE 도 아래처럼 구분이 가능하다.

4. DISABLE NOVALIDATE

이전 버전의 DISABLE 과 똑같다. 즉, 오라클은 constraint 를 고려하지 않는다.

5. DISABLE VALIDATE

테이블의 constraint 를 disable 시키고 해당 constraint 에 걸려있는
index 를 drop 하지만 constraint 를 valid 한 상태로 유지한다.
다시말해 해당 테이블에 대한 모든 DML 작업은 허용하지 않지만
기존 데이터에 대한 validity 는 보장한다는 것이다.

DISABLE VALIADATE constraint 는 unique 나 primary key 에 대한 index
사용을 하지 않으므로 disk space 를 절약하면서도 기존 테이블 데이터에
대한 validity 를 보장하는 것이다.

DISABLE VALIDATE constraint 에 대한 위반되는 DML 에 대해서는 아래의
에러 메시지가 출력된다:

ORA-25128: No insert/update/delete on table with
constraint (x.x) disabled and validated

DISABLE VALIDATE constraint 는 CREATE TABLE 또는 ALTER TABLE
명령을 통해 사용할 수 있다.

1) CREATE TABLE t1 (
a NUMBER CONSTRAINT c1 PRIMARY KEY
,b NUMBER );


Output: Table created.

2) SELECT constraint_name,validated,status FROM user_constraints
WHERE table_name = 'T1' ;

Output: CONSTRAINT_NAME VALIDATED STATUS



--------------------------------------------------------------------------------
-------------
--------------------------------------------------------------------------------
C1 VALIDATED ENABLED

3) SELECT index_name , status FROM user_indexes
WHERE table_name = 'T1' ;

Output: INDEX_NAME STATUS

--------------------------------------------------------------------------------
--------
C1 VALID

4) ALTER TABLE t1 MODIFY CONSTRAINT c1 DISABLE VALIDATE ;

Output: Table altered.

5) SELECT constraint_name,validated,status FROM user_constraints
WHERE table_name = 'T1' ;

Output: CONSTRAINT_NAME VALIDATED STATUS



--------------------------------------------------------------------------------
-------------
--------------------------------------------------------------------------------
C1 VALIDATED DISABLED

6) SELECT index_name , status FROM user_indexes
WHERE table_name = 'T1' ;

Output: no rows selected

댓글 없음:

댓글 쓰기