MySQL 8.4 版本注意事項
可以為可更新的視圖提供 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'