標籤:
這學期開了資料庫的課,對sql注入頗感興趣。因此,對資料庫語句也頗為喜愛。遇到了with check option 問題。這屬於sql view裡面的一個問題。在此略做小結。大牛勿噴!
先自訂一個table 名為 :Star
先定義視圖找出所有張姓明星:
Java代碼
- create view IS_Star
Java代碼
- as
-
- select *from Star
Java代碼
- where name like ‘張%‘
-
- with check option
擷取張姓明星情況:
Java代碼
- select * from IS_Star
此時,with check option 約束條件是對視圖裡面所有的name 首字元必須是以 ‘張’字打頭。不管是修改前還是修改後都必須總從此規則。否則出錯。
比如
Java代碼
- update IS_Star set name=‘劉家輝‘ where name=‘張家輝
這是不可以的。
而
Java代碼
- update IS_test set name=‘張家界‘ where name=‘張家輝‘
是可以。前后姓沒有變。滿足where 後面的約束條件。
而如果在選取視圖的時候沒有使用 with check option 約束語句的話,那麼。是可以改得。也就是張家輝既可以變成劉家輝也可以變成張家界
另外如果選取年齡大於四十的明星
Java代碼
- create view IS_Star1
Java代碼
- as
Java代碼
- select * from Star where age>40
Java代碼
- with check option
Java代碼
-
Java代碼
- update IS_Star1 set age=age-6 where name=‘張家輝‘
這樣會報錯 伺服器: 訊息 550,層級 16,狀態 1,行 1
試圖進行的插入或更新已失敗,原因是目標視圖或者目標視圖所跨越的某一視圖指定了 WITH CHECK OPTION,而該操作的一個或多個結果行又不符合 CHECK OPTION 約束的條件。
語句已終止。
而如果是
Java代碼
- update IS_Star1 set age=age-4 where name=‘張家輝‘
那麼則正確插入。這裡的意思是在視圖裡面的所有資訊,只要在建立視圖的時候加了with check option 那麼。則不允許它的那個屬性值變為不屬於 where 後麵條件的情況
如果不加with check option 那麼則值可以任意變。
Java代碼
- /*create view IS_Star2
- as select * from Star
- where age >40
-
-
- select * from IS_Star2
-
- update IS_Star set age =age-10 where name=‘張家輝‘*/
小結:
1.對於update,有with check option,要保證update後,資料要被視圖查詢出來
2.對於delete,有無with check option都一樣
4.對於insert,有with check option,要保證insert後,資料要被視圖查詢出來
5.對於沒有where 子句的視圖,使用with check option是多餘的
Mysql 視圖筆記2