MySQL 9.0 版本注意事項
可以針對可更新的視圖提供 WITH CHECK OPTION
子句,以防止插入 select_statement
中 WHERE
子句不成立的列。它也可以防止更新 WHERE
子句成立,但更新會導致其不成立的列(換句話說,它會防止可見列被更新為不可見列)。
在可更新視圖的 WITH CHECK OPTION
子句中,LOCAL
和 CASCADED
關鍵字決定當視圖根據另一個視圖定義時,檢查測試的範圍。當沒有給定任何一個關鍵字時,預設值為 CASCADED
。
WITH CHECK OPTION
測試符合標準
使用
LOCAL
時,會檢查視圖的WHERE
子句,然後檢查會遞迴到基礎視圖並套用相同的規則。使用
CASCADED
時,會檢查視圖的WHERE
子句,然後檢查會遞迴到基礎視圖,並將WITH CASCADED CHECK OPTION
新增至其中(用於檢查目的;其定義保持不變),並套用相同的規則。若沒有檢查選項,則不會檢查視圖的
WHERE
子句,然後檢查會遞迴到基礎視圖,並套用相同的規則。
考慮以下資料表和一組視圖的定義
CREATE TABLE t1 (a INT);
CREATE VIEW v1 AS SELECT * FROM t1 WHERE a < 2
WITH CHECK OPTION;
CREATE VIEW v2 AS SELECT * FROM v1 WHERE a > 0
WITH LOCAL CHECK OPTION;
CREATE VIEW v3 AS SELECT * FROM v1 WHERE a > 0
WITH CASCADED CHECK OPTION;
這裡 v2
和 v3
視圖是根據另一個視圖 v1
定義的。
針對 v2
的插入會根據其 LOCAL
檢查選項進行檢查,然後檢查會遞迴到 v1
並再次套用規則。v1
的規則會導致檢查失敗。對 v3
的檢查也會失敗
mysql> INSERT INTO v2 VALUES (2);
ERROR 1369 (HY000): CHECK OPTION failed 'test.v2'
mysql> INSERT INTO v3 VALUES (2);
ERROR 1369 (HY000): CHECK OPTION failed 'test.v3'