CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] [DEFINER = {user
| CURRENT_USER }] [SQL SECURITY { DEFINER | INVOKER }] VIEWview_name
[(column_list
)] ASselect_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
CREATE VIEW
ステートメントは、新しいビューを作成するか、または
OR REPLACE
節が指定されている場合は既存のビューを置き換えます。そのビューが存在しない場合、CREATE
OR REPLACE VIEW
は
CREATE VIEW
と同じになります。ビューが存在する場合、CREATE
OR REPLACE VIEW
は
ALTER VIEW
と同じになります。
select_statement
はビューの定義を提供する
SELECT
ステートメントです。(ビューから選択すると、実際には
SELECT
ステートメントを使用して選択されます。)
select_statement
は、ベーステーブルまたはほかのビューから選択できます。
ビュー定義は作成時に「凍結される」ため、基礎となるテーブルへのそれ以降の変更はビュー定義に影響を与えません。たとえば、ビューがテーブル上で
SELECT *
として定義されている場合、あとでテーブルに追加された新しいカラムはそのビューの一部になりません。
ALGORITHM
節は、MySQL
によるビューの処理方法に影響を与えます。DEFINER
節および SQL SECURITY
節はビューの呼び出しにおいて、アクセス権限を確認するとき使用すべきセキュリティーコンテキストを規定します。WITH
CHECK OPTION
節を指定すると、ビューによって参照されているテーブル内の行への挿入または更新を制約できます。これらの節については、この節のあとの方で説明します。
CREATE VIEW
ステートメントには、ビューに対する
CREATE VIEW
権限と、SELECT
ステートメントによって選択される各カラムに対する何らかの権限が必要です。SELECT
ステートメントの中で使用されているほかのカラムに対して、SELECT
権限を所持していなければなりません。OR
REPLACE
節が存在している場合、ビューの
DROP
権限を所持していなければなりません。
ビューはデータベースに付随します。デフォルト設定によって、デフォルトデータベースの中に新しいビューが生成されます。あるデータベース中にビューを明確に生成させるには、ビューを生成するとき、その名称を
db_name.view_name
と規定してください。
mysql> CREATE VIEW test.v AS SELECT * FROM t;
ベーステーブルとビューはデータベース中で同じ名前空間を共有しているので、データベースに同じ名称のベーステーブルとビューを含めることはできません。
ビューには、ベーステーブルと同じように、ユニークなカラム名を重複することなく持たせなければなりません。デフォルト設定に基づき、SELECT
ステートメントによって復元されたカラムの名称がビューカラム名に対して使用されます。ビューカラムに対して明確な名称を規定するため、オプションの
column_list
節をコンマで区切りをつけた識別子のリストとして附与することができます。column_list
の中に入れる名称の数は
SELECT
ステートメントによって復元されたカラムの数と同じでなければなりません。
MySQL 5.1.29
より前のバージョンでは、既存のビューを変更すると、現在のビュー定義がバックアップおよび保存されます。ビュー定義は、そのテーブルのデータベースディレクトリの
arc
という名前のサブディレクトリに格納されます。ビュー
v
のバックアップファイルには、v.frm-00001
という名前が付けられます。もう一度ビューを変更すると、次のバックアップには
v.frm-00002
という名前が付けられます。最新の 3
つのビューのバックアップ定義が格納されます。
バックアップされたビュー定義は、mysqldump やその他の類似のプログラムでは保持されませんが、ファイルコピー操作を使用して保持できます。ただし、これらのビュー定義は、以前のビュー定義のバックアップとしてのみ使用されます。
これらのバックアップ定義の削除は、mysqld
が実行中でない場合にのみ安全です。mysqld
の実行中に arc
サブディレクトリまたはそこに含まれるファイルを削除すると、次回そのビューを変更しようとしたときにエラーが表示されます。
mysql> ALTER VIEW v AS SELECT * FROM t; ERROR 6 (HY000): Error on delete of '.\test\arc/v.frm-0004' (Errcode: 2)
SELECT
ステートメントによって復元されたカラムはテーブルカラムを引用するシンプルなものにすることができます。これらは関数、定数値、オペレータ等を使用した表現にすることもできます。
SELECT
ステートメント中の不適切なテーブル名あるいはビュー名はデフォルトデータベースに対して解釈されます。ビューには、適切なデータベース名を使ってそのテーブルまたはビュー名に資格を附与することによって、ほかのデータベース中のテーブルまたはビューを引用することができます。
ビューは多くの種類の
SELECT
ステートメントから生成することができます。そこから、ベーステーブルまたはビューを参照することができます。ジョイン、UNION
およびサブ・クエリーを使用することができます。SELECT
はテーブルさえ参照する必要がありません。次の例はほかのテーブルから
2
つのカラム並びにそれらのカラムから計算された表現を選択したビューを定義します。
mysql>CREATE TABLE t (qty INT, price INT);
mysql>INSERT INTO t VALUES(3, 50);
mysql>CREATE VIEW v AS SELECT qty, price, qty*price AS value FROM t;
mysql>SELECT * FROM v;
+------+-------+-------+ | qty | price | value | +------+-------+-------+ | 3 | 50 | 150 | +------+-------+-------+
ビュー定義は以下の制限に規定されます。
SELECT
ステートメントは
FROM
節の中にサブ・クエリーを含めることができません。
SELECT
ステートメントはシステム変数またはユーザー変数を参照することができません。
ストアドプログラム内で、ビュー定義はプログラムパラメータまたはローカル変数を参照できません。
SELECT
ステートメントは準備済みステートメントパラメータを参照することができません。
定義で参照したテーブルまたはビューは存在しなければいけません。ただし、ビューを生成し終えたあとに、定義が参照するテーブルまたはビューを撤去することができます。この場合、ビューの使用はエラーとなります。この類の問題に対してビュー定義を確認するには、CHECK
TABLE
ステートメントを使用してください。
定義は TEMPORARY
テーブルを参照できない上、TEMPORARY
ビューを生成させることができません。
ビュー定義で指定されているすべてのテーブルが、定義時に存在する必要があります。
トリガーにビューを関連させることはできません。
MySQL 5.1.23
では、SELECT
ステートメント内のカラム名のエイリアスは
(256 文字の最大エイリアス長ではなく) 64
文字の最大カラム長に対して確認されます。
ORDER BY
はビュー定義の中で許容されていますが、それ自身
ORDER BY
を持つステートメントを使ってビューから選択すると無視されます。
定義中のほかのオプションあるいは節に対して、オプションまたはビューを参照するステートメントの節が追加されましたが、その効果は定義されていません。たとえば、ビュー定義に
LIMIT
節が含まれているとき、それ自身の
LIMIT
節を持つステートメントを使って選択すると、いずれの限界か適用されるかが定義されていません。SELECT
キーワードに従う
ALL
、DISTINCT
または
SQL_SMALL_RESULT
のようなオプション並びに
INTO
、FOR
UPDATE
、LOCK IN SHARE
MODE
および
PROCEDURE
のような節に関しては、同じ原理が適用します。
ビューを生成させてから、システム変数を変えることによってクエリー処理環境を変えると、ビューから得る結果が影響されることがあります。
mysql>CREATE VIEW v (mycol) AS SELECT 'abc';
Query OK, 0 rows affected (0.01 sec) mysql>SET sql_mode = '';
Query OK, 0 rows affected (0.00 sec) mysql>SELECT "mycol" FROM v;
+-------+ | mycol | +-------+ | mycol | +-------+ 1 row in set (0.01 sec) mysql>SET sql_mode = 'ANSI_QUOTES';
Query OK, 0 rows affected (0.00 sec) mysql>SELECT "mycol" FROM v;
+-------+ | mycol | +-------+ | abc | +-------+ 1 row in set (0.00 sec)
DEFINER
および
SQL SECURITY
節によって、ビューを参照するステートメントの実行時にそのビューに対するアクセス権限を確認するときに使用する
MySQL
アカウントが決定されます。これらの節は、MySQL
5.1.2 で追加されました。SQL
SECURITY
特性の正当な値は、DEFINER
および INVOKER
です。これらの値は、それぞれ、このビューを定義したユーザーまたはこのビューを呼び出したユーザーが必要な権限を保持している必要があることを示します。SQL
SECURITY
のデフォルト値は
DEFINER
です。
DEFINER
節に対して
user
値を指定する場合は、'
の形式 (user_name
'@'host_name
'GRANT
ステートメントで使用されるのと同じ形式) の
MySQL
アカウントである必要があります。user_name
の値と host_name
の値が両方共要求されます。定義者はまた、CURRENT_USER
または
CURRENT_USER()
として指定することもできます。DEFINER
のデフォルト値は
CREATE VIEW
ステートメントを実行するユーザーです。これは、明示的に
DEFINER = CURRENT_USER
を指定するのと同じです。
DEFINER
節を指定する場合は、これらの規則によって正当な
DEFINER
ユーザー値が決定されます。
SUPER
権限を持っていない場合、文字によるか、CURRENT_USER
を使って規定されている
user
値だけが有効なユーザーアカウントとなります。定義子をほかのアカウントに設定することはできません。
SUPER
権限を持っている場合、構文的に有効なアカウントネームを規定することができます。そのアカウントが実在しない場合、警告が生成されます。
SQL SECURITY
値が
DEFINER
であるにもかかわらず、ビューが参照されるときに定義者のアカウントが存在しない場合は、エラーが発生します。
MySQL 5.1.12
では、ビュー定義内で、CURRENT_USER
はデフォルトでそのビューの
DEFINER
値を返します。旧バージョンの場合、および
SQL SECURITY INVOKER
特性を使用して定義されたビューの場合、CURRENT_USER
はビューの呼び出し元のアカウントを返します。ビュー内のユーザー監査については、Auditing MySQL Account Activity
を参照してください。
SQL SECURITY DEFINER
特性を使用して定義されたストアドルーチン内で、CURRENT_USER
は、そのルーチンの
DEFINER
値を返します。ビュー定義に
CURRENT_USER
の
DEFINER
値が含まれている場合は、これによって、このようなプログラム内で定義されたビューも影響を受けます。
DEFINER
節と
SQL SECURITY
節が実装されたとき)MySQL 5.1.2
以降、ビュー権限はこのようにして確認されます。
ビューを定義するとき、ビュー作成者は、ビューがアクセスしたトップレベルのオブジェクトの使用に要する権限を持っていなければなりません。たとえば、先に説明したように、ビュー定義でテーブルカラムを参照している場合、作成者はそのカラムに対する権限を持っている必要があります。定義でストアドファンクションを参照している場合は、その関数を呼び出すために必要な権限を確認するだけで済みます。 ファンクションを作動させるに要する権限は、それを実行するときにだけ確認することができます。ファンクションを呼び出す方法が異なると、ファンクション中にある別な実行パスを使用しなければなない場合があります。
ビューが参照されている場合、そのビューによってアクセスされるオブジェクトに対する権限は、SQL
SECURITY
特性が
DEFINER
または
INVOKER
のどちらであるかに応じて、それぞれ、ビュー作成者または呼び出し元が保持している権限に対して確認されます。
ビューへの参照によってストアドファンクションの実行が発生する場合、その関数内で実行されるステートメントに対する権限の確認は、その関数が
DEFINER
または
INVOKER
のどちらの
SQL SECURITY
特性を使用して定義されているかによって異なります。セキュリティー特徴が
DEFINER
である場合、ファンクションはその作成者の権限を使って作動します。その特徴が
INVOKER
である場合、ファンクションはビューの
SQL SECURITY
特徴によって決定された権限を使用して作動します。
DEFINER
および
SQL SECURITY
節が実装される前の)5.1.2 以前の MySQL
の場合、ビュー中でオブジェクトの使用に要する権限はビュー生成時に確認されます。
例:ビューは保存されているファンクションに依存し、そのファンクションはほかストアドルーチンを起動する場合があります。たとえば、以下のビューは保存されているファンクション
f()
を起動します。
CREATE VIEW v AS SELECT * FROM t WHERE t.id = f(t.name);
f()
にこのようなステートメントが含まれているとします。
IF name IS NULL then CALL p1(); ELSE CALL p2(); END IF;
f()
を実行するとき、f()
の中でステートメントの実行に要する権限を確認する必要があります。これは、f()
中の実行パスによって、p1()
または p2()
に対する権限を確認する必要があることを意味します。これらの権限は実行時に確認する必要があり、その権限を所有している必要のあるユーザーは、ビュー
v
と関数
f()
の
SQL SECURITY
値によって決定されます。
ビューに対する DEFINER
節および SQL SECURITY
節は標準 SQL の拡張子です。標準 SQL
では、ビューは SQL SECURITY
INVOKER
.に対する規則を使って処理されます。
MySQL 5.1.2
より前に作成されたビューを呼び出すと、そのビューは、SQL
SECURITY DEFINER
節および使用しているアカウントと同じ
DEFINER
値を使用して作成されたものとして処理されます。しかし、実際の定義子が未知なので、MySQL
は警告を発行します。警告を撤去するには、ビューを再び生成させて、ビュー定義に
DEFINER
節を含めれば十分です。
オプションの ALGORITHM
節は標準 MySQL の拡張子です。この節は、MySQL
によるビューの処理方法に影響を与えます。ALGORITHM
には 3
つの値が付いています:MERGE
、TEMPTABLE
または
UNDEFINED
。ALGORITHM
節がある場合、デフォルトアルゴリズムは
UNDEFINED
となります。詳細は View Processing Algorithms
をご覧ください。
幾つかのビューは更新可能です。すなわち、基礎をなすテーブルの内容を更新するため、UPDATE
、DELETE
または INSERT
のようなステートメントの中でそれらを使うことができます。ビューを更新可能にするため、ビュー中の行と基礎テーブル中の行の間に
1 対 1
の関係が存在しなければなりません。また、ビューを更新不可能にするその他の特定の構造構文も存在します。
それに対する select_statement
中の WHERE
節が真実であるものを除く行に、更新不能なビューが挿入されるか、当該行が更新されるのを回避するため、WITH
CHECK OPTION
節を附与することができます。
更新可能なビューに対する
WITH CHECK OPTION
節に基づき、LOCAL
と
CASCADED
キーワードはビューがほかのビューに対して定義される場合、チェックテストのスコープを決めます。定義されているビューだけに対して、LOCAL
キーワードは CHECK
OPTION
を制限します。CASCADED
は同様に基礎ビューを評価する確認を起動させます。キーワードが附与されない場合、デフォルト設定は
CASCADED
となります。
更新可能なビューおよび WITH
CHECK OPTION
節の詳細については、Updatable and Insertable Views
を参照してください。