创建[或替换][algorithm = {undefined | merge | temptable}] [definer = {undefined |]用户视图| current_user}] [sql security {definer | invoker}view_name((column_list))select_statement使用[cascade | local]检查选项
创建视图
ステトメントは,新しいビュを作成するか,または或替换
句が指定されている場合は既存のビュを置き換えます。そのビュが存在しない場合,创建或替换视图
は创建视图
と同じです。そのビュが存在する場合,创建或替换视图
は改变观点
と同じです。
select_statement
は,そのビュの定義を提供する选择
ステトメントです。(ビューから選択すると、事実上、选择
ステトメントを使用して選択したことになります.)select_statement
は,ベステブルまたはほかのビュから選択できます。
ビュ定義は作成時に「固定される」ため,ベスとなるテブルへのそれ以降の変更はビュ定義に影響を与えません。たとえば,ビュがテブル上でSELECT *
として定義されている場合,あとでテブルに追加された新しいカラムはそのビュの一部になりません。
算法
句は,MySQLによるビュの処理方法に影響を与えます。定义者
およびSQL安全
句は,ビューの呼び出し時にアクセス権限を確認するときに使用されるセキュリティーコンテキストを指定します。检查选项
句を指定すると,ビュによって参照されているテブル内の行への挿入または更新を制約できます。これらの句にいては,このセクションのあとの方で説明されています。
创建视图
ステトメントには,このビュに対する创建视图
権限と,选择
ステトメントによって選択される各カラムに対する何らかの権限が必要です。选择
ステトメント内の別の場所で使用されているカラムに対しては,选择
権限が必要です。或替换
句が存在する場合は,このビュに対する下降
権限も必要です。このセクションのあとの方で説明されているように,定义者
値によっては,创建视图
に超级
権限も必要になる可能性があります。
ビュが参照されると,このセクションのあとの方で説明されている権限確認が発生します。
ビュはデタベスに属します。デフォルトでは,新しいビューはデフォルトデータベース内に作成されます。ビューを明示的に特定のデータベース内に作成するには、そのビューの作成時に、その名前をdb_name.view_name
として指定します。
mysql>创建视图测试。v AS SELECT * FROM;
データベース内で,ベーステーブルとビューは同じ名前空間を共有するため,ベーステーブルとビューが同じ名前を持つことはできません。
选择
ステトメントによって取得されるカラムは,テブルカラムへの単純な参照にすることができます。また,関数,定数値,演算子などを使用した式にすることもできます。
ビュは,ベブルと同様に,重複のない一意のカラム名を持。デフォルトでは,选择
ステトメントによって取得されるカラムの名前はビュカラム名に使用されます。ビュカラムの明示的な名前を定義するには,オプションのcolumn_list
句をカンマで区切られた識別子のリストとして指定できます。column_list
内の名前の数は,选择
ステトメントによって取得されるカラムの数と同じである必要があります。
选择
ステートメント内の修飾されていないテーブルまたはビュー名は,デフォルトデータベースを基準にして解釈されます。ビューは,テーブルまたはビュー名を適切なデータベース名で修飾することによって,ほかのデータベース内のテーブルまたはビューを参照できます。
ビュは,多くの種類の选择
ステトメントから作成できできます。ベステブルまたはほかのビュを参照できます。結合、联盟
,およびサブクエリを使用できます。选择
がテブルをまったく参照しなくてもかまいません。次の例では,別のテーブルからの2つのカラムに加え,それらのカラムから計算される式を選択するビューを定義しています。
CREATE TABLE t(数量INT,价格INT);mysql> INSERT INTO t VALUES(3,50);mysql> CREATE VIEW v AS SELECT quantity, price, qty*price AS value FROM t;mysql> SELECT * FROM;+------+-------+-------+ | 数量价格| |值 | +------+-------+-------+ | 3 | | 150 | +------+-------+-------+
ビュ定義は,次の制限に従います。
选择
ステトメントに从
句内のサブクエリを含めることはできません。选择
ステトメントは,システムまたはユ変数を参照できません。ストアドプログラム内で,この定義は,プログラムパラメ,タまたはロ,カル変数を参照できません。
选择
ステトメントは,準備済みステタを参照できません。この定義で参照されているテブルまたはビュは,すべて存在する必要があります。ただし,ビュが作成されたあとは,この定義で参照されているテを削除できます。この場合は,このビュ,を使用すると,エラ,が発生します。この種類の問題に関してビュ定義を確認するには,
检查表
ステトメントを使用します。この定義は
临时
テブルを参照できないため,临时
ビュは作成できません。ビュ定義で指定されているテブルは,すべて定義時に存在する必要があります。
トリガをビュに関連付けることはできません。
选择
ステートメント内のカラム名のエイリアスは(256文字の別名の最大の長さではなく)64文字のカラムの最大の長さに対してチェックされます。
命令
はビュ定義内で許可されていますが,独自の命令
を含むステトメントを使用しているビュから選択した場合は無視されます。
この定義内のその他のオプションまたは句の場合は,そのビューを参照しているステートメントのオプションまたは句に追加されますが,その効果は定義されていません。たとえば,ビュ定義に限制
句が含まれているときに,独自の限制
句を含むステトメントを使用しているビュから選択した場合,どの制限が適用されるかは未定義です。この同じ原則は,选择
キワドに続く所有
、截然不同的
、SQL_SMALL_RESULT
などのオプションや,成
、更新
、共享模式锁定
、过程
などの句にも適用されます。
ビューを作成したあとに,システム変数の変更によってクエリー処理環境を変更すると,そのビューから得られる結果に影響を与える可能性があります。
mysql> CREATE VIEW v (mycol) AS SELECT 'abc';mysql> SET sql_mode = ";查询OK, 0 rows affected (0.00 sec) mysql> SELECT "mycol" FROM v;+-------+ | mycol | +-------+ | mycol | +-------+ 1行组(0.01秒)mysql >设置sql_mode =“ANSI_QUOTES”;查询OK, 0 rows affected (0.00 sec) mysql> SELECT "mycol" FROM v;+-------+ | mycol | +-------+ | 美国广播公司 | +-------+ 1行集(0.00秒)
定义者
およびSQL安全
句は,そのビューを参照しているステートメントの実行時に,そのビューに対するアクセス権限を確認するときにどのMySQLアカウントを使用するかを決定します。SQL安全
特性の有効な値は,定义者
と调用程序
です。これらは,それぞれ,そのビューを定義したユーザーまたは呼び出したユーザーが必要な権限を持っている必要があることを示します。SQL安全
のデフォルト値は定义者
です。
定义者
句に用户
値を指定する場合は,'
(user_name
“@”host_name
'格兰特
ステトメントで使用されるのと同じ形式),CURRENT_USER
,またはCURRENT_USER ()
として指定されたMySQLアカウントにするようにしてください。定义者
のデフォルト値は,创建视图
ステトメントを実行するユザです。これは,明示的に定义者= CURRENT_USER
を指定するのと同じです。
定义者
句を指定した場合は,次のルルによって有効な定义者
ユザの値が決定されます。
超级
権限がない場合,有効な唯一の用户
値は,リテラルで指定するか,またはCURRENT_USER
を使用して指定した自分のアカウントです。定義者をほかのアカウントに設定することはできません。超级
権限がある場合は,構文として有効な任意のアカウント名を指定できます。そのアカウントが実際に存在しない場合は,警告が生成されます。存在しない
定义者
アカウントでビュを作成することはできますが,SQL安全
値が定义者
であるが,定義者アカウントが存在しない場合は,そのビュ,が参照されたときにエラ,が発生します。
ビュのセキュリティの詳細は,セクション20.6 "ストアドプログラムおよびビュのアクセスコントロル"を参照してください。
ビュ定義内で,CURRENT_USER
は,デフォルトではそのビュの定义者
値を返します。SQL安全调用程序
特性を使用して定義されたビュの場合,CURRENT_USER
は,そのビュの呼び出し元のアカウントを返します。ビュ内のユザ監査にセクション6.3.13 " SQLベスのMySQLアカウントアクティビティの監査"を参照してください。
SQL安全定义者
特性を使用して定義されたストアドルチン内で,CURRENT_USER
は,そのルチンの定义者
値を返します。ビュ定義にCURRENT_USER
の定义者
値が含まれている場合は,これにより,このようなル,チン内で定義されたビュ,も影響を受けます。
ビュの権限は,次のように確認されます。
ビューの定義時に,ビュー作成者は,そのビューによってアクセスされるトップレベルのオブジェクトを使用するために必要な権限を持っている必要があります。たとえば,ビュー定義がテーブルカラムを参照している場合,作成者は,その定義の選択リスト内の各カラムに対する何らかの権限と,その定義内の別の場所で使用されている各カラムに対する
选择
権限を持っている必要があります。この定義がストアドファンクションを参照している場合は,その関数を呼び出すために必要な権限のみを確認できます。関数呼び出し時に必要な権限は,その関数が実行されるときにしか確認できません。別の呼び出しでは,その関数内の別の実行パスが選択される可能性があります。ビューを参照するユーザーは,そのビューにアクセスするための適切な権限(そのビューから選択するための
选择
や,そのビュに挿入するための插入
など)を持っている必要があります。ビュが参照されると,そのビュによってアクセスされるオブジェクトに対する権限が,
SQL安全
特性が定义者
または调用程序
のどらであるかに応じて,それぞれ,そのビュの定义者
アカウントによって保持されている権限または呼び出し元に対して確認されます。ビューへの参照によってストアドファンクションが実行される場合,その関数内で実行されるステートメントの権限確認は,その関数の
SQL安全
特性が定义者
または调用程序
のどらであるかによって異なります。セキュリティ特性が定义者
である場合,その関数は定义者
アカウントの権限で実行されます。この特性が调用程序
である場合,その関数は,そのビュ,のSQL安全
特性によって決定される権限で実行されます。
例:あるビューがストアドファンクションに依存する可能性があり,さらにその関数がほかのストアドルーチンを呼び出す可能性があります。たとえば,次のビュはストアドファンクションf ()
を呼び出します。
CREATE VIEW v AS SELECT * FROM t WHERE t.id = f(t.name)
f ()
に次のようなステトメントが含まれているとします。
如果name是NULL,那么调用p1();其他调用p2 ();如果;
f ()
が実行されるとき,f ()
内のステトメントを実行するために必要な権限を確認する必要があります。これは,f ()
内の実行パスに応じて,p1 ()
またはp2 ()
に対する権限が必要であることを示します。これらの権限は実行時に確認する必要があり,それらの権限を持っている必要のあるユ,ザ,は,ビュv
と関数f ()
のSQL安全
値によって決定されます。
ビュの定义者
およびSQL安全
句は,標準SQLへの拡張です。標準SQLでは,ビュはSQL安全定义者
のルルを使用して処理されます。標準には,ビューの定義者(これは,ビューのスキーマの所有者と同じです)はそのビューに対する該当する権限(选择
など)を取得し,またそれらを付与することができると記載されています。MySQLにはスキマの「所有者」という概念がないため,MySQLでは定義者を識別するための句が追加されています。定义者
句は,標準が備えている機能,つまり,だれがそのビューを定義したかについての永続的なレコードを備えることを目的とした拡張です。定义者
のデフォルト値がビュ作成者のアカウントになっているのはそのためです。
オプションの算法
句は,標準SQLへのMySQL拡張です。これは,MySQL によるビューの処理方法に影響を与えます。算法
は,合并
、易被诱惑的
,または未定义的
の3の値を受け取ります。算法
句が存在しない場合,デフォルトのアルゴリズムは未定义的
です。詳細は,セクション20.5.2 "ビュ処理アルゴリズム"を参照してください。
いくかのビュは更新可能です。つまり,これらのビューを更新
、删除
、插入
などのステトメントで使用して,ベブルの内容を更新できます。ビューが更新可能であるためには,そのビュー内の行とベースとなるテーブル内の行の間に対1の関係が存在する必要があります。また,ビュを更新不可能にするその他の特定の構造構文も存在します。
更新可能なビュに対して检查选项
句を指定すると,select_statement
内の在哪里
句がtrueである行を除く行への挿入または更新を回避できます。
更新可能なビュに対する检查选项
句では,そのビュ,が別のビュ,との関連で定義されている場合,当地的
および级联
キワドによってチェックテストのスコプが決定されます。当地的
キワドは,检查选项
を,定義されているビュのみに制限します。级联
を指定すると,ベスとなるビュに対するチェックも評価されます。どらのキワドも指定されていない場合,デフォルトは级联
になります。
更新可能なビュおよび检查选项
句の詳細は,セクション20.5.3 "更新可能および挿入可能なビュ"を参照してください。