MYSQLのCHECK OPTION

それに対するselect_statement中のWHERE節が真実であるものを除く行に、
更新不能なビューが挿入されるか、当該行が更新されるのを回避するため、
WITH CHECK OPTION節を附与することができます。
更新可能なビューに対するWITH CHECK OPTION節に基づき、
LOCALとCASCADEDキーワードはビューが他のビューに対して定義される場合、
チェックテストの範囲を決めます。

定義されているビューだけに対して、LOCALキーワードはCHECK OPTIONを制限します。
CASCADEDは同様に基礎ビューを評価するチェックを起動させます。キーワードが附与されない場合、
デフォルト設定はCASCADEDとなります。

CREATE TABLE t1 (a INT);
CREATE VIEW view_1 AS SELECT * FROM t1 WHERE a < 2 WITH CHECK OPTION;


CREATE VIEW view_2 AS SELECT * FROM view_1 WHERE a > 0
WITH LOCAL CHECK OPTION;


CREATE VIEW view_3 AS SELECT * FROM view_1 WHERE a > 0
WITH CASCADED CHECK OPTION;

view_check

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

以下のステートメントはこれらの違いを例示したものです。

view_insert_check

[その他TIP]
ビューを生成させてから、システム変数を変えることによってクエリ処理環境を変えると、
ビューから得る結果が影響されることがあります。

CREATE VIEW V_DATE_TIME AS
select current_date,current_time;

current_date_time

以下のような変数も同様にユーザーによって違う結果を返します。
mysql> select CURRENT_USER;
+----------------+
| CURRENT_USER |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)

mysql> select CURRENT_USER();
+----------------+
| CURRENT_USER() |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)

mysql>

5.0.13/5.1.2以前のMySQLで生成されたビューを呼び出す場合、それは、SQL SECURITY DEFINER
節並びにユーザのアカウントと同じDEFINER値を使って生成されたものとして処理されます。しかし、
実際のデファイナーが未知なので、MySQLは警告を発行します。警告を撤去するには、
ビューを再び生成させて、ビュー定義にDEFINER節を含めれば十分です。

Comments are closed.

Post Navigation