10bet网址
MySQL 8.0参考手册
相关的文档10bet官方网站 本手册下载 本手册节选

13.1.23 CREATE VIEW语句

创建[或替换][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  | +------+-------+-------+

视图定义受以下限制:

  • 选择语句不能引用系统变量或用户定义变量。

  • 在存储程序中,选择语句不能引用程序参数或局部变量。

  • 选择语句不能引用准备语句参数。

  • 定义中引用的任何表或视图都必须存在。如果视图创建后,定义引用的表或视图被删除,则视图的使用将导致错误。要检查这类问题的视图定义,请使用检查表声明。

  • 定义不能指a临时表,并且不能创建临时视图。

  • 不能将触发器与视图关联。

  • 类中列名的别名选择语句根据64个字符的最大列长度(而不是256个字符的最大别名长度)进行检查。

命令是否在视图定义中被允许,但如果您使用具有自己的语句从视图中进行选择,则会忽略它命令

对于定义中的其他选项或子句,它们被添加到引用视图的语句的选项或子句中,但效果未定义。例如,如果视图定义包含限制子句,然后使用自己的语句从视图中进行选择限制子句中,未定义适用哪个限制。同样的原则也适用于诸如所有截然不同的,或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_nameCURRENT_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子句的视图”