WITH CHECK OPTION

テーブルがAUTO_INCREMENTカラムを含んでいないテーブル上にある挿入可能なビューに
挿入するAUTO_INCREMENTカラムを含んでいる場合、ビューの一部でないカラムにデフォルト
値を挿入した副作用が見えないので、カラムはLAST_INSERT_ID()の値を変更しません。

それに対するselect_statement中のWHERE節が真実であるものを除く行に、
更新不能なビューが挿入されるか、当該行が更新されるのを回避するため、
WITH CHECK OPTION節を附与することができます。

更新可能なビューに対するWITH CHECK OPTION節に基づき、LOCALとCASCADEDキーワード
はビューが他のビューに対して定義される場合、チェックテストの範囲を決めます。
定義されているビューだけに対して、LOCALキーワードはCHECK OPTIONを制限します。
CASCADEDは同様に基礎ビューを評価するチェックを起動させます。キーワードが附与されない場合、
デフォルト設定はCASCADEDとなります。以下のテーブル並びにビューのセットを考慮すると:

CREATE TABLE TABLE01 (ID INT);


CREATE VIEW VIEW01 AS SELECT * FROM TABLE01 WHERE ID < 2 WITH CHECK OPTION;


CREATE VIEW VIEW02 AS SELECT * FROM VIEW01 WHERE ID > 0
WITH LOCAL CHECK OPTION;


CREATE VIEW VIEW03 AS SELECT * FROM VIEW01 WHERE ID > 0
WITH CASCADED CHECK OPTION;

create_view_check_opt

v2ビューとv3ビューが他のビューに対して定義され、v1. v2 にはLOCAL チェックオプションが含まれています。
従って、挿入はv2チェックだけに対してテストされます。v3にはCASCADED チェックオプションが含まれているので、
挿入は、自身のチェックのみならず、基礎ビューに対してもテストされます。

WITH LOCAL CHECK OPTION = ( ID > 0 )
INSERT INTO VIEW02 VALUES (2);

WITH CASCADED CHECK OPTION = (ID > 0 と ID < 2 )
INSERT INTO VIEW03 VALUES (2);

--------------------------------------------------------------------------------------
VIEW03にはCASCADEオプションでVIEW03のCHECK OPTIONも適用された。
--------------------------------------------------------------------------------------
mysql> INSERT INTO VIEW01 VALUES (2);
ERROR 1369 (HY000): CHECK OPTION failed 'STUDY.VIEW01'
mysql>
-------------------------------------------

view_cascade

関連システム変数

updatable_views_with_limit

更新の許可するかどうかを制御する。ビューに基準テーブルで定義したプライマリキー
のすべてのカラムが含まれていない場合に、更新ステートメントで LIMIT 節を含んでいたら、
そのビューを更新するかどうか、ということである。このような更新は GUI ツールなどから生成される。
ここでの更新は UPDATE または DELETE ステートメントのこと。ここでのプライマリ キーとは
PRIMARY KEY または UNIQUE インデックスのことで、NULL をカラムに含まない。

この変数の値は 2 種類ある。

* 1 または YES:エラー メッセージではなく、警告だけを発行。(デフォルト値)
* 0 または NO:更新禁止。

参考サイト


20.2. CREATE VIEW 構文

4.2.3. システム変数

Comments are closed.

Post Navigation