# 일반 VIEW
SQL> CREATE OR REPLACE NOFORCE VIEW EMP_VIEW20
  2  AS
  3  SELECT EMPNO, ENAME, DEPTNO
  4  FROM EM01
  5  WHERE DEPTNO = 20;

View created.

SQL> SELECT * FROM EMP_VIEW20;

     EMPNO ENAME          DEPTNO
---------- ---------- ----------
      7566 JONES              20
      7902 FORD               20
      7368 SMITH              20
      7788 SCOTT              20
      7369 SMITH              20
      7876 ADAMS              20

6 rows selected.

SQL> UPDATE EMP_VIEW20 SET ENAME = 'TEST' WHERE EMPNO = 7369;

1 row updated.

SQL> SELECT * FROM EMP_VIEW20;

     EMPNO ENAME          DEPTNO
---------- ---------- ----------
      7566 JONES              20
      7902 FORD               20
      7368 SMITH              20
      7788 SCOTT              20
      7369 TEST               20
      7876 ADAMS              20

6 rows selected.

SQL> UPDATE EMP_VIEW20 SET DEPTNO = 40 WHERE EMPNO = 7369;

1 row updated.

SQL> SELECT * FROM EMP_VIEW20;

     EMPNO ENAME          DEPTNO
---------- ---------- ----------
      7566 JONES              20
      7902 FORD               20
      7368 SMITH              20
      7788 SCOTT              20
      7876 ADAMS              20

SQL> SELECT * FROM EM01;

     EMPNO ENAME      JOB              MGR HIREDATE            SAL       COMM       DEPTNO
---------- ---------- --------- ---------- ------------ ---------- ----------   ----------
      7654 MARTIN     SALESMAN        7698 28-SEP-81          1250       1400        30
      7566 JONES      MANAGER         7839 02-APR-81          2975                      20
      7844 TURNER     SALESMAN        7698 08-SEP-98          1500          0        30
      7900 JAMES      CLERK           7698 03-NOV-81          1957                       30
      7369 TEST       CLERK           7902 17-NOV-80           800        40
      7876 ADAMS      CLERK           7788 12-JAN-83          1100                        20
- 뷰는 쿼리문이므로 기본 테이블의 정보를 기본으로 조회 합니다. 뷰로 UPDATE문을 수행하면 뷰를 생성할 때 사용되었던 기본 테이블의 내용이 변경되는 것이고, 뷰를 조회하면 변경된 결과를 저장한 기본 테이블에서 뷰를 정의할 때 기술한 쿼리문을 수행해서 출력합니다. 뷰를 통해서 보여지는 정보는 기본 테이블에서 얻어지는 것입니다.

# WITH CHECK OPTION
- 부를 생성할 때 WHERE 다음에 WITH CHECK OPTION 을 기술하면 그 조건에 의해서 기본 테이블에서 정보가 추출되는 것이므로 조건에 사용되어진 컬럼 값을 뷰를 통해서 변경 불가능하게 됩니다. 즉 위 예제에서는 뷰를 생성할 때 부서번호가 20인 사원 정보만 추출했지만 해당 뷰로 부서 번호를 40번으로 변경할 수있었습니다.
그래서 뷰에서 보여지는 사원이 하나 감소하게 되었습니다. 하지만 WITH CHECK OPTION 을 지정하면 부서 번호가 뷰를 생성할 때 조건으로 사용되었으므로 절대 부서번호 값은 뷰를 통해서 변경 불가능 하게 됩니다.
SQL> CREATE OR REPLACE NOFORCE VIEW EMP_VIEW20
  2  AS
  3  SELECT EMPNO, ENAME, DEPTNO
  4  FROM EM01
  5  WHERE DEPTNO = 20 WITH CHECK OPTION
  6 ; 

View created.

SQL> SELECT VIEW_NAME, TEXT FROM USER_VIEWS;

VIEW_NAME                              TEXT
------------------------------  ------------------------------------------
VIEW_EMPLOYEES                     SELECT *
                                                 FROM EMPLOYEES
-------------------------------------------------------------------------
EMP_VIEW20                              SELECT EMPNO, ENAME, DEPTNO
                                                FROM EM01
                                                WHERE DEPTNO = 20 WITH CHECK OPTION
-------------------------------------------------------------------------
CHECK_OPTION                         SELECT empno, ename, deptno, job
                                                       FROM  emp_test3
                                                       WHERE deptno = 10

-- 사원의 이름을 변경하는것은 가능함.
SQL> UPDATE EMP_VIEW20
  2  SET ENAME = 'TEST3'
  3  WHERE EMPNO = 7876;

1 row updated.

-- 부서 번호가 뷰를 생성할때 WHERE 절에 사용된 컬럼이므로 다음과 같이 WITH CHECK OPTION 이 지정된 뷰에 대해서 부서번호 값을 변경하려고 접근하면 에러가 발생함.
SQL> UPDATE EMP_VIEW20
  2  SET DEPTNO = 40
  3  WHERE EMPNO = 7876;
UPDATE EMP_VIEW20
       *
ERROR at line 1:
ORA-01402: view WITH CHECK OPTION where-clause violation


SQL> SELECT * FROM EMP_VIEW20;

     EMPNO ENAME          DEPTNO
---------- ---------- ----------
      7566 JONES              20
      7902 FORD               20
      7368 SMITH              20
      7788 SCOTT              20
      7876 TEST3              20

# WITH READ ONLY
- 뷰의 WITH READ ONLY 옵션은 뷰를 생성한 후 어떠한 DML문도 수행할 수 없도록 하는 기능을 합니다.
SQL> CREATE OR REPLACE NOFORCE VIEW EMP_VIEW20
  2  AS
  3  SELECT EMPNO, ENAME, DEPTNO
  4  FROM EM01
  5  WHERE DEPTNO = 20 WITH READ ONLY
  6  ;

View created.

SQL> UPDATE EMP_VIEW20
  2  SET ENAME = 'TEST5'
  3  WHERE EMPNO = 7876;
SET ENAME = 'TEST5'
    *
ERROR at line 2:
ORA-01733: virtual column not allowed here (가상 열은 사용할 수 없습니다.)




참고 자료 : 클릭하세요. 오라클 10g + PL/SQL 입문
08 1, 2010 13:20 08 1, 2010 13:20

Trackback URL : http://develop.sunshiny.co.kr/trackback/534

Leave a comment


- 뷰를 생성하는 경우에 일반적으로 기본 테이블이 존재한다는 가정하에서 쿼리문을 작성합니다. 극히 드물기는 하지만, 기본 테이블이 존재하지 않는 경우에도 뷰를 생성할 수 잇는데 이때에는 FORCE 옵션이 지정되어 있어야 합니다. 특별한 설정이 없으면 NOFORCE 옵션이 지정된 것이므로 반드시 존재하는 기본 테이블을 이용한 쿼리문으로 뷰를 생성해야 합니다.
SQL> DESC EMPLOYEES;
ERROR:
ORA-04043: object EMPLOYEES does not exist


SQL> CREATE OR REPLACE VIEW VIEW_EMPLOYEES
  2  AS
  3  SELECT *  
  4  FROM EMPLOYEES;
FROM EMPLOYEES
     *
ERROR at line 4:
ORA-00942: table or view does not exist


SQL> CREATE OR REPLACE FORCE VIEW VIEW_EMPLOYEES
  2  AS
  3  SELECT *
  4  FROM EMPLOYEES;

Warning: View created with compilation errors.

-- 경고는 발생하지만 뷰가 생성되었다는 메시지를 출력합니다.
-- 생성된 뷰를 데이터 딕셔너리인 USER_VIEWS를 통해서 검색할수 있습니다.
SQL> SELECT VIEW_NAME, TEXT FROM USER_VIEWS;

VIEW_NAME                      TEXT
------------------------- ------------------------------------
VIEW_EMPLOYEES            SELECT *
                                        FROM EMPLOYEES
--------------------------------------------------------------
CHECK_OPTION                 SELECT empno, ename, deptno, job
                                              FROM  emp_test3
                                             WHERE deptno = 10
SQL>





참고 자료 : 클릭하세요. 오라클 10g + PL/SQL 입문
08 1, 2010 12:48 08 1, 2010 12:48

Trackback URL : http://develop.sunshiny.co.kr/trackback/533

Leave a comment


Recent Posts

  1. Linux - Telnet 서비스 비활성및 실행
  2. NT - 서버 원격데스크탑 연결
  3. NT - http와 https간에 세션 공유가...
  4. Unix - 대량 파일 이동, 삭제시 Argu...
  5. Oracle - SYS_CONTEXT 함수를 이용하...

Recent Comments

  1. 네. 고맙습니다^^ 행복한 한해 보... sunshiny 01 16,
  2. sunshiny님. 안녕하세요... 올려 주... yihans 01 16,
  3. 답글 주셔서 고맙습니다^^ 소스 복... sunshiny 01 11,
  4. 관리자만 볼 수 있는 댓글입니다. 비밀방문자 01 11,
  5. 넵 답변감사합니다^^ 좋은 하루 되... 노로링

Recent Trackbacks

  1. 윈도우 cmd 명령어 팁 월풍도원(月風道院) - Delight on th... %M
  2. 파일 압축 Like RadioHead %M
  3. Mysql - mysql 설치후 Character set... 멀고 가까움이 다르기 때문 %M

Calendar

«   02 2012   »
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29      

Bookmarks

  1. 위키피디아
  2. MysqlKorea
  3. Oracle All Documentation
  4. 엑셈
  5. 오라클 클럽
  6. 네이버개발자센터
  7. API - Java
  8. API - Spring
  9. Java Community
  10. Reference - Spring
  11. 스프링사용자
  12. 자바지기
  13. Ready System
  14. Solaris Freeware
  15. Linux-Site
  16. RedHat Korea
  17. 윈디하나의 솔라나라

Site Stats

TOTAL 217714 HIT
TODAY 16 HIT
YESTERDAY 115 HIT