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,数据库根据调用用户检查是否有操作相应对象的权限 。

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

posted on 2022-02-25 17:56  西伯尔  阅读(68)  评论(0编辑  收藏  举报