ORACLE UPDATABLE JOIN VIEW & BYPASS_UJVC
from OTN : Managing Views, Sequences, and Synonyms
http://download.oracle.com/docs/cd/B10501_01/server.920/a96521/views.htm#3816
from OTN : KEY PRESERVED TABLE
http://download.oracle.com/docs/cd/B10501_01/server.920/a96521/views.htm#4054
1.
UPDATABLE
JOIN VIEW 의 의미
A. 말그대로 JOIN된 VIEW가 UPDATE가 가능함을 말한다.
B. MODIFIABLE JOIN VIEW 라고도 한다.
2.
UPDATABLE
JOIN VIEW 의 제약
A. UPDATE
i. 모든 UPDATE 가능한 뷰의 컬럼들은 KEY-PRESERVED TABLE[i]에 반드시 맵핑되어야 한다. 만약 VIEW가 WITH CHECK OPTION 으로 제약이 걸려있으면 모든 조인컬럼과 REPEATED TABLE은 NONUPDATABLE 하다
B. DELETE
i. 조인안에 정확히 하나의 KEY-PRESERVED TABLE 이 있을 때 VIEW의 ROW는 삭제가 가능하다. VIEW가 WITH CHECK OPTION 으로 정의되어 있거나 KEY PRESERVED TABLE이 반복되는 경우 삭제가 불가능하다.
C. INSERT
i. INSERT STATEMENT는 암묵적이든 명시적이든 NONKEY PRESERVED TABLE의 컬럼을 참조해서는 안된다. JOIN VIEW가 WITH CHECK OPTION 절로 정의되어 있는 경우 INSERT STATEMENT는 허용되지 않는다.
3.
BYPASS_UJVC
의 의미
A. JOIN 된 VIEW를 수정하기 위해서는 해당 VIEW가 KEY-PRESERVED TABLE 이어야 한다.
B. KEY는 곧 제약조건을 가져야 함을 의미한다.
C. BYPASS_UJVC는 제약조건 없이 수정이 가능케 한다.
D. ORACLE은 연산 결과에 대해 보장하지 않는다.
4.
BYPASS_UJVC
의 사용
A. 샘플 스키마 두개를 생성하였고 내용은 다음과 같다.
SQL> select * from tab1;
ID CODE
---------- ----------
1 4
2 5
3 6
4 7
5 8
6 9
7 10
8 11
9 12
10 13
10 rows selected.
SQL> select * from tab2;
ID CODE
---------- ----------
5 7
6 8
7 9
8 10
9 11
10 12
11 13
12 14
13 15
14 16
15 17
11 rows selected.
B. JOIN을 사용해 VIEW를 만든다.
create view bind
as
select a.id,a.code acode,b.code bcode
from tab1 a, tab2 b
where a.id = b.id
C. UPDATE를 실행한다.
SQL> select * from bind;
ID ACODE BCODE
---------- ---------- ----------
5 8 7
6 9 8
7 10 9
8 11 10
9 12 11
10 13 12
6 rows selected.
SQL> update bind set acode = 10 where id=5;
update bind set acode = 10 where id=5
*
ERROR at line 1:
ORA-01779: cannot modify a column which maps to a non key-preserved table
JOIN 된 VIEW를 수정하기 위해서는 KEY-PRESERVED TABLE이어야 한다.
D. BYPASS_UJVC를 사용하여 UPDATE를 실행한다.
SQL> update /*+ bypass_ujvc */ bind set acode = 10 where id = 5;
1 row updated.
SQL> select * from bind;
ID ACODE BCODE
---------- ---------- ----------
5 10 7
6 9 8
7 10 9
8 11 10
9 12 11
10 13 12
6 rows selected.
SQL> select * from tab1;
ID CODE
---------- ----------
1 4
2 5
3 6
4 7
5 10
6 9
7 10
8 11
9 12
10 13
10 rows selected.
VIEW와 원래 TABLE TAB1을 조회해 보았고 값은 정상적으로 수정되었다.
5.
BYPASS_UJVC
의 문제
A. 키값없이 update가 가능하기 때문에 무결성을 해치는 문제가 발생할 수 있다.
/// 문제 발생 사례 제작 ///
B. merge ( 10g NF ) 를 사용할 것을 추천