1、创建视图语法
语法提示命令:? CREATE VIEW
Name: 'CREATE VIEW'
Description:
Syntax:
CREATE
[OR REPLACE]
[ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
[DEFINER = { user | CURRENT_USER }]
[SQL SECURITY { DEFINER | INVOKER }]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
ALGORITHM,有三种视图算法选项:
1. undefined:默认设置,表示没有指定算法,一般此选项会自动指定为merge。
2. temptable:临时表算法,系统先执行视图封装的select语句,再执行视图外部的select语句,因要执行两次查询语句,所以效率相对低一些。
3. merge:合并算法,系统将视图封装的select语句与视图外部的select语句进行合并后再执行这条合并后的语句,因只需执行一次,所以效率相对高。
DEFINER:指明是哪个用户定义的。
默认为当前用户CURRENT_USER,也可指定其他用户。
如果想通过调用者
来判断是否具有访问该PROCEDURE的权限,则可用SQL SECURITY指定。
上面示例指定DEFINER为用户'admin'@'localhost',所以任意用户A访问该PROCEDURE 时,能否成功取决于A是否有调用该PROCEDURE的权限,以及DEFINER是否有procedure中的SELECT的权限。
SQL SECURITY:指明谁有权限来执行。数据库检查一个用户是否有存储过程中各种操作的权限。至于检查哪个用户由其值决定。
DEFINER,默认,数据库根据definer检查是否有操作相应对象的权限;
INVOKER,数据库根据调用用户检查是否有操作相应对象的权限 。
![](https://img2022.cnblogs.com/blog/968024/202202/968024-20220225172537593-1166573418.png)
1.该示例是创建procedure的例子,不是view,不过字段功能相同。
2.mysql创建view、trigger、function、procedure、event时都会定义"DEFINER"和"SQL SECURITY"字段。
虽然指定了DEFINER ,但同时也指定了SQL SECURITY 类型为INVOKER ,SQL SECURITY 优先级高
,所以安全类型为INVOKER,
用户能否访问取决于用户是否有执行该PROCEDURE 的权限及该PROCEDURE 中的SELECT 权限(与select操作的表有关)。
2、视图意义
(1)视图可以节约SQL语句:将一条复杂的查询语句使用视图进行保存,以后可以直接对视图进行操作。
(2)数据安全:视图的操作主要是针对查询,如果对视图结果进行处理(删除),不会对影响基表的数据(相对安全)
(3)视图往往在大项目中使用,而且是多系统使用:可以对外提供有用的数据,但是隐藏关键(无用)的数据:数据安全。
(4)视图可以对外提供友好型:不同的视图提供不同的数据,对外专门设计。
参考:
https://www.cnblogs.com/pengyin/p/6380233.html
https://blog.csdn.net/liukanglucky/article/details/51111608
https://blog.csdn.net/h1025372645/article/details/89160506
https://blog.csdn.net/qq_19865749/article/details/69662568
https://blog.csdn.net/weixin_29266749/article/details/113274335
https://www.icode9.com/content-2-329983.html
作者:西伯尔
出处:http://www.cnblogs.com/sybil-hxl/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。