ORACLE WITH CHECK OPTION子句詳解
今天一個朋友在問關於建立檢視時候WITH CHECK OPTION是什麼意思,我當時也沒多想,就比較籠統的回答了一下。後來自己想了想,好像自己也記不太清楚了,腦子裡只有個大概的印象。
好了話不多說,下面還是透過實驗來看一下吧。
C:/Documents and Settings/Admin>sqlplus /nolog
SQL*Plus: Release 10.2.0.1.0 - Production on Sat Nov 14 20:22:13 2009
Copyright (c) 1982, 2005, Oracle. All rights reserved.
SQL> show user
USER is ""
SQL> conn scott/tiger
Connected.
SQL> drop table t1;
Table dropped.
SQL> create table t1(id number,name varchar2(20));
Table created.
SQL> insert into t1 values(1,'wh')
2 ;
1 row created.
SQL> insert into t1 values(2,'wp');
1 row created.
SQL> insert into t1 values(3,'wr');
1 row created.
SQL> commit;
Commit complete.
SQL> select * from t1;
ID NAME
---------- --------------------
1 wh
2 wp
3 wr
SQL> create view v_t1
2 as
3 select * from t1
4 where id=2
5 with check option;
View created.
首先來看一下INSERT
SQL> insert into v_t1 values(1,'haha');
insert into v_t1 values(1,'haha')
*
ERROR at line 1:
ORA-01402: view WITH CHECK OPTION where-clause violation
--這裡由於檢視中定義了where id=2的條件並且加有with check option子句,所以插入id=1的記錄就會報錯。
SQL> insert into v_t1 values(2,'haha');
1 row created.
SQL> commit;
Commit complete.
SQL> select * from t1;
ID NAME
---------- --------------------
1 wh
2 wp
3 wr
2 haha
--喏,看到了吧,插入id=2的記錄就成功了。
接下來看看UPDATE
SQL> select * from v_t1;
ID NAME
---------- --------------------
2 wp
2 haha
SQL> update v_t1 set id=1 where name='wp';
update v_t1 set id=1 where name='wp'
*
ERROR at line 1:
ORA-01402: view WITH CHECK OPTION where-clause violation
--這裡如果你把name='wp'的記錄中id改為1,那麼這條記錄就不符合檢視定義中id=2的條件了,就會從檢視中被刪去,這樣也是不允許的,所以也就報錯了。
SQL> update v_t1
2 set name='hehe'
3 where name='haha';
1 row updated.
SQL> select * from v_t1;
ID NAME
---------- --------------------
2 wp
2 hehe
--看,這樣更改就可以了,因為只是更改了name欄位,id欄位仍然為2。
SQL> update v_t1 set id=11 where name='wh';
0 rows updated.
--從這裡可以看到,如果某條在表中可是不在檢視中的記錄,那麼你是無法透過檢視來修改它的。
SQL> update t1 set id=11 where name='wh';
1 row updated.
SQL> select * from t1;
ID NAME
---------- --------------------
11 wh
2 wp
3 wr
2 haha
SQL> select * from v_t1;
ID NAME
---------- --------------------
2 wp
2 haha
最後我們看看delete是怎樣的
SQL> delete from v_t1 where name='wh';
0 rows deleted.
--這裡的道理和上面一樣,name='wh'這條記錄根本就沒在檢視中顯示,你怎麼可以透過檢視來刪除呢?
SQL> delete from v_t1 where name='wp';
1 row deleted.
SQL> commit;
Commit complete.
SQL> select * from v_t1;
ID NAME
---------- --------------------
2 haha
SQL> select * from t1;
ID NAME
---------- --------------------
11 wh
3 wr
2 haha
SQL>
總結:我想了下,with check option可以這麼解釋,透過檢視進行的修改,必須也能透過該檢視看到修改後的結果。
http://blog.csdn.net/wanghai__/article/details/4811342
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/90618/viewspace-1104659/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL中BETWEEN子句的用法詳解MySql
- 詳解MySQL中WHERE子句的用法MySql
- MTK Camera相關的Makefile Option詳解
- Oracle SCN詳解Oracle
- oracle rowid詳解Oracle
- ORACLE -詳解SCNOracle
- Oracle行列轉換及pivot子句的用法Oracle
- [轉載] Oracle:start with...connect by子句的用法Oracle
- 【解決DML 語句包含不帶 INTO 子句的 OUTPUT 子句】
- ORACLE的HINT詳解Oracle
- Oracle練習詳解Oracle
- oracle oradebug使用詳解Oracle
- [20220128]Check the datapump file header information in Oracle.txtHeaderORMOracle
- ORACLE基礎之oracle鎖(oracle lock mode)詳解Oracle
- oracle: default role 詳解(轉)Oracle
- Oracle案例04——ORA-39700: database must be opened with UPGRADE optionOracleDatabase
- Oracle中job的使用詳解Oracle
- 一、oracle 高水位線詳解Oracle
- Oracle GoldenGate常用引數詳解OracleGo
- oracle rac 核心引數詳解Oracle
- Oracle中pivot函式詳解Oracle函式
- 【RECYCLEBIN】Oracle回收站詳解Oracle
- oracle 密碼詳解以及破解Oracle密碼
- oracle連線查詢詳解Oracle
- Oracle的表空間quota詳解Oracle
- Oracle SCN機制詳細解讀Oracle
- 詳解oracle資料庫閃回Oracle資料庫
- DMSQL TOP子句SQL
- DMSQL WITH FUNCTION子句SQLFunction
- 【INDEX】Oracle分割槽索引技術詳解IndexOracle索引
- 【DATAGUARD】Oracle Dataguard體系架構詳解Oracle架構
- ORACLE中Cursor_sharing引數詳解Oracle
- SQL中 where 子句和having子句中的區別SQL
- onclick="return check()" 和 onclick="check()" 區別
- Oracle minus用法詳解及應用例項Oracle
- oracle中的processes,session,transaction引數詳解OracleSession
- 詳解Oracle AWR執行日誌分析工具Oracle
- oracle partition by group by,詳解partition by和group by對比Oracle
- postgreSQL with子句學習SQL