创建[或替换][algorithm = {undefined | merge | temptable}] [definer = .用户[sql security {definer | invoker}]视图view_name((column_list))select_statement使用[cascade | local]检查选项
的创建视图
语句创建新视图,或替换现有视图或替换
条款。如果视图不存在,则创建或替换视图
和创建视图
.如果视图存在,创建或替换视图
取代它。
有关视图使用限制的信息,请参见第25.9条“查阅意见的限制”.
的select_statement
是一个选择
提供视图定义的语句。从视图中选择,实际上是使用选择
声明。)的select_statement
可以选择从基表,其他视图。从MySQL 8.0.19开始,选择
语句可以使用值
语句作为其源,或者可以用表格
声明中,与创建表……选择
.
视图定义是”冻”并且不受基础表定义的后续更改的影响。例如,如果视图被定义为SELECT *
在表上,后来添加到表中的新列不会成为视图的一部分,从表中删除的列在从视图中进行选择时将导致错误。
的算法
子句影响MySQL如何处理视图。的定义者
而且SQL安全
子句指定在视图调用时检查访问特权时要使用的安全上下文。的检查选项
子句用于约束对视图引用的表中的行进行插入或更新。这些子句将在本节后面介绍。
的创建视图
声明要求创建视图
控件所选择的每一列都具有一定的权限选择
声明。的其他地方使用的列选择
声明,你必须有选择
特权。如果或替换
从句是存在的,你也必须有下降
视图的特权。如果定义者
子句存在时,所需的特权取决于用户
价值,如在第25.6节,“存储对象访问控制”.
当一个视图被引用时,特权检查将在本节后面进行描述。
视图属于数据库。默认情况下,在默认数据库中创建一个新视图。若要显式地在给定数据库中创建视图,请使用db_name.view_name
用数据库名限定视图名的语法:
创建视图测试。vAS SELECT * FROM t;
中不合格的表或视图名称选择
语句也会根据默认数据库进行解释。视图可以引用其他数据库中的表或视图,方法是用适当的数据库名称限定表或视图名称。
在数据库中,基表和视图共享相同的名称空间,因此基表和视图不能具有相同的名称。
检索的列选择
语句可以是对表列的简单引用,也可以是使用函数、常量值、运算符等的表达式。
视图必须具有惟一的列名,没有重复的列名,就像基表一样。类检索的列的名称默认情况下选择
语句用于视图列名。要为视图列定义显式名称,请指定可选的column_list
子句作为逗号分隔的标识符的列表。名字的数量column_list
方法检索的列数必须相同选择
声明。
视图可以由多种类型创建选择
语句。它可以引用基表或其他视图。它可以使用连接,联盟
和子查询。的选择
甚至不需要参考任何表格:
创建视图v_today (today)作为SELECT CURRENT_DATE
下面的例子定义了一个从另一个表中选择两列的视图,以及从这些列中计算出的表达式:
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 | +------+-------+-------+
视图定义受以下限制:
命令
是否在视图定义中被允许,但如果您使用具有自己的语句从视图中进行选择,则会忽略它命令
.
对于定义中的其他选项或子句,它们被添加到引用视图的语句的选项或子句中,但效果未定义。例如,如果视图定义包含限制
子句,然后使用自己的语句从视图中进行选择限制
子句中,未定义适用哪个限制。同样的原则也适用于诸如所有
,截然不同的
,或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安全
特征值是定义者
(默认)调用程序
.这表明定义视图或调用视图的用户必须分别持有所需的特权。
如果定义者
从句是存在的用户
值应该是MySQL帐户指定为'
,user_name
“@”host_name
'CURRENT_USER
,或CURRENT_USER ()
.允许用户
值取决于您持有的特权,如中所讨论的第25.6节,“存储对象访问控制”.有关视图安全性的更多信息,请参见该部分。
如果定义者
子句时,默认定义者是执行创建视图
声明。这与指定是一样的定义者= CURRENT_USER
明确。
在视图定义中,CURRENT_USER
函数返回视图的定义者
默认值。方法定义的视图SQL安全调用程序
特点,CURRENT_USER
返回视图调用者的帐户。有关视图内用户审计的信息,请参见第6.2.22节,“基于sql的帐户活动审计”.
类定义的存储例程中SQL安全定义者
特点,CURRENT_USER
返回程序的定义者
价值。如果视图定义中包含定义者
的价值CURRENT_USER
.
MySQL像这样检查视图权限:
在视图定义时,视图创建者必须拥有使用视图访问的顶级对象所需的特权。例如,如果视图定义引用表列,则创建者必须对定义的选择列表中的每一列具有某些特权
选择
定义中其他地方使用的每个列的特权。如果定义引用存储的函数,则只能检查调用该函数所需的特权。函数调用时所需的特权只能在执行时检查:对于不同的调用,函数内可能采用不同的执行路径。当视图被引用时,视图访问的对象的特权将与视图持有的特权进行检查
定义者
帐户或调用程序,这取决于SQL安全
特点是定义者
或调用程序
,分别。如果对视图的引用导致存储函数的执行,则对函数内执行语句的权限检查取决于函数是否
SQL安全
特点是定义者
或调用程序
.如果安全特性为定义者
的权限运行该函数定义者
帐户。如果特征是调用程序
,该函数使用由视图的权限决定的特权运行SQL安全
的特点。
示例:视图可能依赖于一个存储函数,而该函数可能调用其他存储例程。例如,下面的视图调用一个存储函数f ()
:
CREATE VIEW v AS SELECT * FROM t WHERE t.id = f(t.name)
假设f ()
包含如下语句:
如果name是NULL,那么调用p1();其他调用p2 ();如果;
中执行语句所需的特权f ()
需要检查的时候f ()
执行。这可能意味着需要特权p1 ()
或p2 ()
,取决于内部的执行路径f ()
.必须在运行时检查这些特权,必须拥有这些特权的用户由SQL安全
视图的值v
和功能f ()
.
的定义者
而且SQL安全
视图子句是对标准SQL的扩展。在标准SQL中,视图是使用的规则处理的SQL安全定义者
.该标准规定视图的定义者与视图模式的所有者相同,可以获得视图上的适用特权(例如,选择
),并可能给予它们。MySQL没有模式的概念”老板”,因此MySQL添加了一个子句来标识定义器。的定义者
从句是一种延伸,目的是要达到标准所具有的东西;也就是说,定义视图的人的永久记录。这就是默认设置的原因定义者
值是视图创建者的帐户。
可选算法
子句是对标准SQL的MySQL扩展。它会影响MySQL处理视图的方式。算法
有三个值:合并
,易被诱惑的
,或未定义的
.有关更多信息,请参见第25.5.2节,“视图处理算法”,以及第8.2.2.4节“通过合并或物化优化派生表、视图引用和公共表表达式”.
有些视图是可更新的。也就是说,你可以在这样的语句中使用它们更新
,删除
,或插入
来更新基础表的内容。要使视图可更新,视图中的行与底层表中的行之间必须存在一对一的关系。还有一些其他的构造使视图不可更新。
视图中生成的列被认为是可更新的,因为可以给它赋值。但是,如果显式更新了这样的列,则惟一允许的值为默认的
.有关已生成列的信息,请参见第13.1.20.8节“创建表和生成的列”.
的检查选项
子句可用于可更新视图,以防止对行的插入或更新在哪里
条款的select_statement
是真的。
在一个检查选项
子句用于可更新视图当地的
而且级联
当视图根据另一个视图定义时,关键字确定检查测试的范围。的当地的
关键字限制检查选项
仅用于被定义的视图。级联
导致对底层视图的检查也被计算。当两个关键字都没有给出时,默认为级联
.
有关可更新视图和检查选项
条款,请参阅第25.5.3节“可更新和可插入视图”,第25.5.4节“带有CHECK OPTION子句的视图”.