개인참고자료/오라클(데이터베이스)

DML과 With Check Option의 사용

경진 2008. 8. 27. 14:45
insert into(select s_id, s_name, reg_date, major_id, tuition, discount, sex
              from student
             where dept_id = 120)
     values(199, 'Jojo', to_date('07-JUN-99', 'DD-Mon-RR'), 'ART_309', 3400, null, 'FEMALE');

위의 문장은 현재 Jojo 라는 학생의 정보를 새롭게 추가할 때 학과아이디(dept_id)가 120라는 값과 select 절에 명시한 컬럼 값을 설정하고 있다. 원래의 의도는 학과아이디(dept_id)값도 함께 추가하는 것이지만 실제 실행결과는 다르게 나온다. select 절에 학과아이디(dept_id)를 명시하지 않았기 때문에 dept_id=120이란 값은 추가되지 못하며 그 자리에는 다음 결과 처럼 널(null)값이 들어가게 된다.

select * from student;
S_ID SNAME DEPT_ID REG_DATE  MAJOR_ID TUITION DISCOUNT SEX
101  Tom        30 31-JUL-99 STAT_101    8900       .1 MALE
102  Sean       60 17-ARP-89 IE_205      9300          MALE
107  Robert    140 28-JUN-99 MSTS_201    4500          MALE
………………………………………………………………………………………
178  Jerry     120 12-JUL-99 ART_106    22000          MALE
179  Park       60 05-JUL-98 IE_304     16500      .13 MALE
199   Jojo               07-JUN-99 ART_309      3400               FEMALE

이러한 실수를 미리 확인하고 보다 정확한 문장을 생성하기 위하여 다음과 같이 with check option을 사용하는 것이다.

insert into(select s_id, s_name, reg_date, major_id, tuition, discount, sex
              from student
             where dept_id = 120 WITH CHECK OPTION)
     values(199, 'Jojo', to_date('07-JUN-99', 'DD-Mon-RR'), 'ART_309', 3400, null, 'FEMALE');

              from student
                    *
ERROR at line 2:
ORA-01402: view WITH CHECK OPTION where-clause violation

이처럼 with check option을 사용하게 되면 select 절에 명시되지 않은 컬럼의 데이터를 추가하려는 경우 에러를 발생시키며 문장을 수정할 것을 요구하게 된다.

다음은 새롭게 수정된 문장이면 select 절에 학과아이디(dept_id)가 포함되어져 있는 것을 확인할 수 있다.

insert into(select s_id, s_name, dept_id,reg_date, major_id, tuition, discount, sex
              from student
             where dept_id = 120 WITH CHECK OPTION)
     values(144, 'Koko', 120, to_date('07-JUN-99', 'DD-Mon-RR'), 'ART_303', 3200, null, 'FEMALE');

select * from student;
S_ID SNAME DEPT_ID REG_DATE  MAJOR_ID TUITION DISCOUNT SEX
101  Tom        30 31-JUL-99 STAT_101    8900       .1 MALE
102  Sean       60 17-ARP-89 IE_205      9300          MALE
107  Robert    140 28-JUN-99 MSTS_201    4500          MALE
………………………………………………………………………………………
178  Jerry     120 12-JUL-99 ART_106    22000          MALE
179  Park       60 05-JUL-98 IE_304     16500      .13 MALE
199  Jojo          07-JUL-99 ART_309     3400          FEMALE
144  Koko      120 07-JUN-99 ART_303     3200          FEMALE