iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >MySQL中DEFINER怎么用
  • 381
分享到

MySQL中DEFINER怎么用

2023-06-20 21:06:35 381人浏览 薄情痞子
摘要

这篇文章将为大家详细讲解有关MySQL中DEFINER怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。前言:在 Mysql 数据库中,在创建视图及函数的时候,你有注意过 definer 选项吗?在迁移

这篇文章将为大家详细讲解有关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: utf8mb4collation_connection: utf8mb4_general_ci1 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: utf8mb4collation_connection: utf8mb4_general_ci1 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 属性,请做好测试,清楚修改前后的区别。

  • 数据库迁移时,要注意新环境存在相关对象的定义者用户。

  • 做数据库迁移时,建议首先在新环境创建相关用户及赋予权限。

关于“MySQL中DEFINER怎么用”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

您可能感兴趣的文档:

--结束END--

本文标题: MySQL中DEFINER怎么用

本文链接: https://www.lsjlt.com/news/300185.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • MySQL中DEFINER怎么用
    这篇文章将为大家详细讲解有关MySQL中DEFINER怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。前言:在 MySQL 数据库中,在创建视图及函数的时候,你有注意过 definer 选项吗?在迁移...
    99+
    2023-06-20
  • mysql中definer的作用是什么
    在MySQL中,DEFINER是用于指定触发器、存储过程、函数等对象的创建者或所有者。指定DEFINER可以控制对象的执行权限和访问...
    99+
    2024-04-09
    mysql
  • mysql中怎么修改所有的definer
    本篇文章给大家分享的是有关mysql中怎么修改所有的definer,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。mysql中的definer是...
    99+
    2024-04-02
  • mysql中definer的使用方法是什么
    在MySQL中,DEFINER是用来指定存储过程、函数、视图的创建者的属性。通过DEFINER属性,可以指定一个用户来代替当前用户来...
    99+
    2024-04-09
    mysql
  • Mysql中Anemometer怎么用
    这篇文章给大家分享的是有关Mysql中Anemometer怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。准备条件:1.MySQL开启慢查询2.安装Percona Toolk...
    99+
    2024-04-02
  • mysql中event怎么用
    这篇文章主要为大家展示了“mysql中event怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“mysql中event怎么用”这篇文章吧。 —— 查看ev...
    99+
    2024-04-02
  • mysql中exists怎么用
    这篇文章主要介绍mysql中exists怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完! 在mysql中,exists用于检查子查询是否至少会返回一行...
    99+
    2024-04-02
  • MySQL中DAYOFWEEK怎么用
    这篇文章主要介绍了MySQL中DAYOFWEEK怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。DAYOFWEEK(date)SELECT DAYOFWEEK(...
    99+
    2023-06-17
  • mysql中distinct怎么用
    mysql中distinct的使用方法:1.在终端命令行中启动mysql;2.使用“mysql -u root -p”登录mysql数据库;3.打开并进入数据表;4.使用distinct函数来查询不重复的数据。具体步骤如下:首先,在终端命令...
    99+
    2024-04-02
  • mysql中top怎么用
    小编给大家分享一下mysql中top怎么用,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!mysql top的用法:在mysql中select top用法和mysql server有所...
    99+
    2024-04-02
  • MySQL中Explain怎么用
    小编给大家分享一下MySQL中Explain怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! ...
    99+
    2024-04-02
  • mysql中describe怎么用
    mysql 中的 describe 命令用于获取表的元数据信息,包括:字段名称、数据类型、长度、是否允许空值、默认值、键。它返回一个结果集,包含有关表结构、列类型、约束和索引的详细信息。...
    99+
    2024-04-29
    mysql
  • Linux中MySQL怎么用
    这篇文章将为大家详细讲解有关Linux中MySQL怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。show databases;2.use mysql转换database3.show tables 显...
    99+
    2023-06-03
  • mysql中replace怎么用
    小编给大家分享一下mysql中replace怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!replace语句在一般的情况下和insert差不多,但...
    99+
    2023-06-14
  • MySQL中WEEKDAY怎么用
    这篇文章将为大家详细讲解有关MySQL中WEEKDAY怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。WEEKDAY(date)SELECT WEEKDAY(‘2016-01-16'...
    99+
    2023-06-02
  • mysql中decimal怎么用
    mysql 中 decimal 数据类型用于表示精确的小数和货币值,特点包括:精确存储小数,不受浮点数据的舍入误差影响。范围取决于 precision 值,例如 decimal(10, ...
    99+
    2024-04-29
    mysql
  • mysql中now()怎么用
    now() 函数返回服务器当前的时间戳,即当前日期和时间,在 sql 查询中直接调用即可:获取当前时间戳:select now();插入时间戳:insert into ... ...
    99+
    2024-05-01
    mysql
  • mysql中innodb怎么用
    这篇文章主要介绍mysql中innodb怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!下面我们就来看看innodb的用法及形式。1.InnoDB主要特点(1)可以通过自动增长列,方法是auto_incremen...
    99+
    2023-06-14
  • MySQL中SQL_NO_CACHE怎么用
    这篇文章主要介绍了MySQL中SQL_NO_CACHE怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 S...
    99+
    2024-04-02
  • MySQL中BINARY怎么用
    这篇文章给大家分享的是有关MySQL中BINARY怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。 数据库版本:MySQL 5.6.26线上某业...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作