본문 바로가기

카테고리 없음

ORACLE UPDATABLE JOIN VIEW & BYPASS_UJVC v1.0

ORACLE UPDATABLE JOIN VIEW & BYPASS_UJVC

 

 

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 TABLENONUPDATABLE 하다

B.      DELETE

                         i.         조인안에 정확히 하나의 KEY-PRESERVED TABLE 이 있을 때 VIEWROW는 삭제가 가능하다. VIEW WITH CHECK OPTION 으로 정의되어 있거나 KEY PRESERVED TABLE이 반복되는 경우 삭제가 불가능하다.

C.      INSERT

                         i.         INSERT STATEMENT는 암묵적이든 명시적이든 NONKEY PRESERVED TABLE의 컬럼을 참조해서는 안된다. JOIN VIEWWITH 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 )  를 사용할 것을 추천

 

 



[i] KEY-PRESERVED-TABLES

테이블의 모든 키가 JOIN의 결과로 나온 테이블의 키가 될 때 이를 KEY-PRESERVED 하다 한다.