MySQL DEFINER具体使用详解
来源:脚本之家
时间:2023-01-10 10:51:43 391浏览 收藏
本篇文章主要是结合我之前面试的各种经历和实战开发中遇到的问题解决经验整理的,希望这篇《MySQL DEFINER具体使用详解》对你有很大帮助!欢迎收藏,分享给更多的需要的朋友学习~
前言:
在 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 *************************** 1. row *************************** View: view_definer Create View: CREATE ALGORITHM=UNDEFINED DEFINER=`testuser`@`%` SQL SECURITY DEFINER VIEW `view_definer` AS select `test_tb`.`stu_id` AS `stu_id`,`test_tb`.`stu_name` AS `stu_name` from `test_tb` character_set_client: utf8mb4 collation_connection: utf8mb4_general_ci 1 row in set (0.00 sec) mysql> show create view view_invoker\G *************************** 1. row *************************** View: view_invoker Create View: CREATE ALGORITHM=UNDEFINED DEFINER=`testuser`@`%` SQL SECURITY INVOKER VIEW `view_invoker` AS select `test_tb`.`stu_id` AS `stu_id`,`test_tb`.`stu_name` AS `stu_name` from `test_tb` character_set_client: utf8mb4 collation_connection: utf8mb4_general_ci 1 row in set (0.00 sec) # 只给uview用户查询这两个视图的权限 来进行查询测试 mysql> select user(); +-----------------+ | user() | +-----------------+ | uview@localhost | +-----------------+ 1 row in set (0.00 sec) mysql> show grants; +--------------------------------------------------------+ | Grants for uview@% | +--------------------------------------------------------+ | GRANT USAGE ON *.* TO 'uview'@'%' | | GRANT SELECT ON `testdb`.`view_definer` TO 'uview'@'%' | | GRANT SELECT ON `testdb`.`view_invoker` TO 'uview'@'%' | +--------------------------------------------------------+ 3 rows in set (0.00 sec) mysql> select * from view_definer; +--------+----------+ | stu_id | stu_name | +--------+----------+ | 1001 | from1 | | 1002 | dfsfd | | 1003 | fdgfg | +--------+----------+ 9 rows in set (0.00 sec) mysql> select * from view_invoker; ERROR 1356 (HY000): View 'testdb.view_invoker' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them # 结果是view_definer查询正常,而view_invoker无法查询 因为uview用户不具有test_tb表的查询权限
自定义函数及存储过程也是类似,若 SQL SECURITY 属性为 INVOKER ,同样需要调用者有执行权限并且有引用的相关对象的权限,才能成功执行。
2.一些注意事项
额外补充点知识,只有拥有创建权限且有 SUPER 权限的用户才可以建 DEFINER = 其他用户的对象。例如:root 账号可以创建 DEFINER = testuser 的视图,而 testuser 在有创建视图的前提下只能创建 DEFINER 为自己的视图。
为了更细致的了解 DEFINER 相关作用,以视图为例再来说几个特殊情况下的示例:
假设用户 u1 不存在,使用 root 账号可以创建 DEFINER = u1 的视图,若该视图的 SQL SECURITY 属性为 DEFINER ,则查询时会报用户不存在的错误,若该视图的 SQL SECURITY 属性为 INVOKER ,则使用 root 账号可正常查询该视图。
假设用户 u2 存在但不具有查询表 a 的权限,使用 root 账号可以创建 DEFINER = u2 的视图来查询表 a ,若该视图的 SQL SECURITY 属性为 DEFINER ,则查询时报缺少权限的错误,若该视图的 SQL SECURITY 属性为 INVOKER ,则使用 root 账号可正常查询该视图。当使用用户 u2 登录时,则创建视图来查询表 a 会直接报错缺少权限,即创建不了查询表 a 的视图,无论此视图的 SQL SECURITY 属性是什么。
看完上述示例后,不清楚你对 DEFINER 是否有了更清晰的认识,有兴趣的同学可以自己测试看一看。结合笔者日常经验,说下 DEFINER 相关注意事项吧:
- SQL SECURITY 属性建议使用默认的 DEFINER 。
- 某个库内的视图、函数、存储过程建议使用统一的 DEFINER 用户。
- 不要轻易修改及删除数据库用户,因为此用户可能是相关对象的定义者。
- 若要修改 SQL SECURITY 属性,请做好测试,清楚修改前后的区别。
- 数据库迁移时,要注意新环境存在相关对象的定义者用户。
- 做数据库迁移时,建议首先在新环境创建相关用户及赋予权限。
总结:
本篇文章主要介绍了 DEFINER 相关知识,这些主要在创建视图、函数、存储过程等对象时会遇到,平时比较容易被忽略。但这些细节还是应该注意的,多了解多学习下,这样到真正用到的时候可以避免很多错误。
到这里,我们也就讲完了《MySQL DEFINER具体使用详解》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于mysql的知识点!
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
463 收藏
-
206 收藏
-
132 收藏
-
188 收藏
-
404 收藏
-
101 收藏
-
265 收藏
-
209 收藏
-
446 收藏
-
339 收藏
-
285 收藏
-
259 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 508次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 497次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 484次学习
-
- 受伤的猎豹
- 这篇文章内容真是及时雨啊,太全面了,很棒,mark,关注老哥了!希望老哥能多写数据库相关的文章。
- 2023-03-04 11:54:29
-
- 魁梧的灯泡
- 这篇技术文章太及时了,好细啊,很棒,mark,关注大佬了!希望大佬能多写数据库相关的文章。
- 2023-01-29 09:06:55
-
- 无聊的过客
- 这篇技术贴真及时,细节满满,感谢大佬分享,码起来,关注博主了!希望博主能多写数据库相关的文章。
- 2023-01-18 17:51:22
-
- 缓慢的大山
- 好细啊,已收藏,感谢作者的这篇文章内容,我会继续支持!
- 2023-01-17 13:08:43
-
- 秀丽的荔枝
- 写的不错,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,看完之后很有帮助,总算是懂了,感谢up主分享文章内容!
- 2023-01-15 07:43:02
-
- 默默的巨人
- 这篇技术贴太及时了,太详细了,很好,码住,关注老哥了!希望老哥能多写数据库相关的文章。
- 2023-01-13 13:23:53
-
- 自觉的服饰
- 受益颇多,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,看完之后很有帮助,总算是懂了,感谢博主分享技术文章!
- 2023-01-12 10:02:58
-
- 糊涂的苗条
- 这篇博文真是及时雨啊,作者加油!
- 2023-01-11 19:29:44