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'