本文转载自微信公众号「MySQL技术」,函数作者MySQL技术。注意转载本文请联系MySQL技术公众号。创建
在 MySQL 数据库中,视图啥意思在创建视图及函数的函数时候,你有注意过 definer 选项吗?注意在迁移视图或函数后是否有过报错情况,这些其实都可能和 definer 有关系。创建本篇文章主要介绍下 MySQL 中 definer 的视图啥意思含义及作用。
1.DEFINER简单介绍
以视图为例,函数我们来看下官方给出的视图创建基础语法:
- CREATE
- [OR REPLACE]
- [ALGORITHM = { UNDEFINED | MERGE | TEMPTABLE}]
- [DEFINER = user]
- [SQL SECURITY { DEFINER | INVOKER }]
- VIEW view_name [(column_list)]
- AS select_statement
- [WITH [CASCADED | LOCAL] CHECK OPTION]
仔细看上面语法,发现 definer 出现了两次,一次是 DEFINER = user 一次是 SQL SECURITY 选项可以设置为 DEFINER 或 INVOKER ,看到这里,你有猜到 definer 的作用了吗?
definer 翻译成中文是“定义者”的意思。MySQL中,创建视图(view)、函数(function)、存储过程(procedure)、触发器(trigger)、事件(event)时,都可以指定 DEFINER = user 选项,即指定此对象的定义者是谁,若不显式指定,则创建此对象的用户就是定义者。
对于视图、函数及存储过程,还可以指定 SQL SECURITY 属性,其值可以为 DEFINER(定义者) 或 INVOKER(调用者),表示在执行过程中,使用谁的权限来执行。DEFINER 表示按定义者拥有的权限来执行,INVOKER 表示用调用者的权限来执行。
默认情况下,SQL SECURITY 属性为 DEFINER 。其值为 DEFINER 时,数据库中必须存在 DEFINER 指定的定义者用户,并且该定义者用户拥有对应的操作权限及引用的相关对象的权限,执行者只需拥有调用权限就能成功执行。当 SQL SECURITY 属性为 INVOKER 时,则需要执行者有调用权限并且有引用的相关对象的权限,才能成功执行。
简单来说,假设一个视图查询了 a b c 三张表,若此视图的 SQL SECURITY 属性为 DEFINER ,当使用用户 u 查询此视图时,用户 u 只需此视图的查询权限即可;若此视图的 SQL SECURITY 属性为 INVOKER ,则用户 u 需要有此视图的查询权限且有 a b c 三张表的查询权限。下面通过示例来具体演示下:
- # 创建两个视图 定义者都是testuser 查询的是test_tb表
- mysql> show grants for 'testuser'@'%';
- +------------------------------------------------------------------------------------------------------+
- | Grants for testuser@% |
- +------------------------------------------------------------------------------------------------------+
- | GRANT USAGE ON *.* TO 'testuser'@'%' |
- | GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, CREATE VIEW, SHOW VIEW ON `testdb`.* TO 'testuser'@'%' |
- +------------------------------------------------------------------------------------------------------+
- 2 rows in set (0.00 sec)
- mysql> show create view view_definer\G
(责任编辑:综合)
贝达药业(300558.SZ)公布消息:凯铭投资解押239万股及质押的511万股延期购回
2017《财富》100家增长最快公司排行榜发布,多家中国公司上榜
港铁公司(0066.HK)去年大幅亏损48.09亿港元 全年普通股息合共每股1.23港元
Epic出台新政策:首发独占游戏 开发者6个月可获得全部收益!