Oracle - VIEW 생성시 WITH CHECK OPTION, WITH READ ONLY
Posted 08 1, 2010 13:20, Filed under: DataBase/Oracle
# 한번의 광고 클릭으로, 당신을 대신해서 불우이웃을 도울 기회가 많아집니다.
# 일반 VIEW
# WITH CHECK OPTION
- 부를 생성할 때 WHERE 다음에 WITH CHECK OPTION 을 기술하면 그 조건에 의해서 기본 테이블에서 정보가 추출되는 것이므로 조건에 사용되어진 컬럼 값을 뷰를 통해서 변경 불가능하게 됩니다. 즉 위 예제에서는 뷰를 생성할 때 부서번호가 20인 사원 정보만 추출했지만 해당 뷰로 부서 번호를 40번으로 변경할 수있었습니다.
그래서 뷰에서 보여지는 사원이 하나 감소하게 되었습니다. 하지만 WITH CHECK OPTION 을 지정하면 부서 번호가 뷰를 생성할 때 조건으로 사용되었으므로 절대 부서번호 값은 뷰를 통해서 변경 불가능 하게 됩니다.
# WITH READ ONLY
- 뷰의 WITH READ ONLY 옵션은 뷰를 생성한 후 어떠한 DML문도 수행할 수 없도록 하는 기능을 합니다.
참고 자료 : 클릭하세요. 오라클 10g + PL/SQL 입문
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문을 수행하면 뷰를 생성할 때 사용되었던 기본 테이블의 내용이 변경되는 것이고, 뷰를 조회하면 변경된 결과를 저장한 기본 테이블에서 뷰를 정의할 때 기술한 쿼리문을 수행해서 출력합니다. 뷰를 통해서 보여지는 정보는 기본 테이블에서 얻어지는 것입니다.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
# 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
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 (가상 열은 사용할 수 없습니다.)
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 입문
"DataBase / Oracle" 분류의 다른 글
| Oracle - SYS_CONTEXT 함수를 이용하여 접속 세션 정보 추출 (2) | 2011/12/13 |
| Oracle - ASSM(Automatic Segment Space Management) (0) | 2011/09/18 |
| Oracle - 사용자의 테이블 스페이스 검색및 이동 (0) | 2011/09/18 |
| Oracle - 9i 설치관련 패치(Requirements for Installing Oracle 9iR2 on RHEL 4) (0) | 2011/09/01 |
| Oracle - 삭제된 데이타 복구하기 (0) | 2011/08/04 |
| Oracle - SQL문으로 oracle alert 로그 확인 (0) | 2011/06/21 |
| Oracle - Export, Import (0) | 2011/05/29 |
| Oracle - Control File 파일 장애 복구 (0) | 2011/05/15 |
| Oracle - 사용자 관리. (0) | 2011/05/07 |
| Oracle - ORA-01157, ORA-01110 테이블 스페이스 에러 (0) | 2011/05/01 |
# 한번의 광고 클릭으로, 당신을 대신해서 불우이웃을 도울 기회가 많아집니다.
Response :
0 Trackback
,
0 Comment
Trackback URL : http://develop.sunshiny.co.kr/trackback/534