강좌

HOME > 강좌 >
강좌| 리눅스 및 오픈소스에 관련된 강좌를 보실 수 있습니다.
 
8이후 추가된 disable novalidate
조회 : 3,758  


8이후 추가된 disable novalidate

 

환경: Windows 2000 Advanced Server, Oracle EE 8.1.6

오라클8 이후 부터 변경된 제약조건 enable/disable을 테스트해본 예이다.
8이전에는 제약조건(constraint)은 enable/disable 2가지로 상태변경을 했었다.
8이후부터는 3개로 변경되었다.

disable
enable validate
enable novalidate

disable은 이전의 disable과 동일하고, enable validate의 경우 이전의 enable과 동일하다
enable novalidate의 경우, 새로이 추가된 기능이다.
기존의 enable(enable validate로 변경됨)의 경우 constarint를 enable할 시점에 있어 기존의
데이터에 constraint를 위반하는 data가 있으면 enable이 실패하게 된다.
하지만 enable novalidate를 사용하면 기존의 있던 데이터에 대해서는 constraint위반을 체크하지
않고, 새로 입력되는 데이터에 대해서만 체크하게 된다.

아래는 테스트시 사용하게 될 테이블과 DML문이다.

create table employee
(
empid number(10) not null,
name varchar2(40) not null,
salary number(10) not null,
constraint pk_employees_01 primary key(empid) deferrable
);

insert into employee values(1, 'maddog', 2500);
insert into employee values(1, 'superman', 2500);0
insert into employee values(1, 'batman', 2500);
insert into employee values(2, 'kang', 2500);


실제 테스트예

employee테이블을 생성한다.
constraint가 나중에 체크되도록 primary key에 deferrable옵션을 사용했다.
이 옵션을 사용하면 commit시점에서 constraint가 체크된다.
SQL> create table employee
  2  (
  3  empid number(10) not null,
  4  name varchar2(40) not null,
  5  salary number(10) not null,
  6  constraint pk_employees_01 primary key(empid) deferrable
  7  );

테이블이 생성되었습니다.

중복되는 키(empid가 1)를 갖는 2개의 row를 insert한다.
commit시 당연히 오류가 날 것이다.
SQL> insert into employee values(1, 'maddog', 2500);

1 개의 행이 만들어졌습니다.

SQL> insert into employee values(1, 'superman', 2500);

1 개의 행이 만들어졌습니다.

SQL> commit;
commit
*
1행에 오류:
ORA-02091: 트랜잭션이 롤백되었습니다
ORA-00001: 무결성 제약 조건(KANG.PK_EMPLOYEES_01)에 위배됩니다

그냥 데이터가 들어갔는지 확인해보자. 당연히 없다.
SQL> select * from employee;

선택된 레코드가 없습니다.

중복된 키를 갖지 않았으면 당연히 commit된다.
SQL> insert into employee values(1, 'maddog', 2500);

1 개의 행이 만들어졌습니다.

SQL> commit;

커밋이 완료되었습니다.

SQL> delete from employee;

1 행이 삭제되었습니다.

SQL> commit;

커밋이 완료되었습니다.

이제 실제 enable novalidate를 테스트해보자
primary key를 disable하고 난후, 위와 똑같은 상황에서 enable novalidate를 해보자.
SQL> alter table employee
  2  disable constraint pk_employees_01;

테이블이 변경되었습니다.

SQL> insert into employee values(1, 'maddog', 2500);

1 개의 행이 만들어졌습니다.

SQL> insert into employee values(1, 'superman', 2500);

1 개의 행이 만들어졌습니다.

SQL> commit;

커밋이 완료되었습니다.

SQL> alter table employee
  2  enable constraint pk_employees_01;
alter table employee
*
1행에 오류:
ORA-02437: (KANG.PK_EMPLOYEES_01)을 검증할 수 없습니다 - 잘못된 기본 키입니다


SQL> alter table employee
  2  enable validate constraint pk_employees_01;
alter table employee
*
1행에 오류:
ORA-02437: (KANG.PK_EMPLOYEES_01)을 검증할 수 없습니다 - 잘못된 기본 키입니다


SQL> alter table employee
  2  enable novalidate constraint pk_employees_01;

테이블이 변경되었습니다.

SQL> insert into employee values(1, 'batman', 2500);

1 개의 행이 만들어졌습니다.

SQL> commit;
commit
*
1행에 오류:
ORA-02091: 트랜잭션이 롤백되었습니다
ORA-00001: 무결성 제약 조건(KANG.PK_EMPLOYEES_01)에 위배됩니다


SQL> insert into employee values(2, 'kang', 2500);

1 개의 행이 만들어졌습니다.

SQL> commit;

커밋이 완료되었습니다.

SQL> select * from employee;

     EMPID NAME                                         SALARY
---------- ---------------------------------------- ----------
         1 superman                                       2500
         1 maddog                                         2500
         2 kang                                           2500

SQL> 

[원글링크] : https://www.linux.co.kr/home2/board/subbs/board.php?bo_table=lecture&wr_id=726


이 글을 트위터로 보내기 이 글을 페이스북으로 보내기 이 글을 미투데이로 보내기

 
강명규
홈페이지 : http://dbakorea.pe.kr/

e-mail : myunggyu골뺑이orgio.net