mysql如何修改所有的definer

摘要:
mysql中的definer是什么,有什么作用?如下为总结出的方便修改所有definer的方法,可以直到查漏补缺的作用。现在在mysql涉及的definer有view、trigger、function、procedure、event。

mysql中的definer是什么,有什么作用?

我们在mysql创建view、trigger、function、procedure、event时都会定义一个Definer=‘xxx’,类似如下:

CREATE
    ALGORITHM =UNDEFINED
    DEFINER = `root`@`%`
    SQL SECURITY DEFINER
VIEW `v_ questions` AS
    SELECT
        `q`.`id` AS`id`,
        `q`.`title` AS`title`
    FROM
         Test q;
或者像这样的:
CREATE DEFINER=`root`@`%` PROCEDURE`user_count`()
  LANGUAGE SQL
  NOTDETERMINISTIC
  CONTAINSSQL
  SQL SECURITY DEFINER
  COMMENT ''
BEGIN
    select count(*) from mysql.user;
END

加红的部分SQL SECURITY 其实后面有两个选项,一个为DEFINER,一个为INVOKER

SQL SECURITY { DEFINER | INVOKER } :指明谁有权限来执行。DEFINER 表示按定义者拥有的权限来执行

INVOKER 表示用调用者的权限来执行。默认情况下,系统指定为DEFINER

以存储过程为例:

(1)MySQL存储过程是通过指定SQL SECURITY子句指定执行存储过程的实际用户;

(2)如果SQL SECURITY子句指定为DEFINER,存储过程将使用存储过程的DEFINER执行存储过程,验证调用存储过程的用户是否具有存储过程的execute权限和DEFINER用户是否具有存储过程引用的相关对象的权限;

(3)如果SQL SECURITY子句指定为INVOKER,那么MySQL将使用当前调用存储过程的用户执行此过程,并验证用户是否具有存储过程的execute权限和存储过程引用的相关对象的权限;

(4)如果不显示的指定SQL SECURITY子句,MySQL默认将以DEFINER执行存储过程。

我们来看下面几个小例子。

先授权一个:
grant all on testdb.* to 'user1'@'%' identified by '000000' with grant option;    
然后我们创建一个存储过程如下:
USE`testdb`;
DROP procedure IF EXISTS`user_count`;
DELIMITER $$
USE`testdb`$$
CREATE DEFINER=`root`@`%` PROCEDURE`user_count`()
  LANGUAGE SQL
  NOTDETERMINISTIC
  CONTAINSSQL
  SQL SECURITY INVOKER
  COMMENT ''
BEGIN
    select count(*) from mysql.user;
END$$
DELIMITER ;

用root帐号登陆:

mysql> usetestdb;
Databasechanged
mysql>call user_count();
+----------+
| count(*) |
+----------+
|        3 |
+----------+
1 row in set (0.00sec)
Query OK, 0 rows affected (0.00sec)
可以正常查询出来。
我们再用user1进行登陆:
mysql> usetestdb;
Databasechanged
mysql>call user_count();
ERROR 1142 (42000): SELECT command denied to user 'user1'@'localhost' for table 'user'

发现系统报错查询不到了,这是因为我们在上述定义的SQL SECURITY值为INVOKER,存储过程执行过程中会以user1具有的权限来执行,其中调用到了mysql的库,而我们的user1帐户只有testdb库的使用权限,所以会返回失败。

我们把上面的invoker改为definer再来试一下:

update mysql.proc set security_type='DEFINER' where db='testdb' and name='user_count';
再次用user1进行登陆:
mysql> usetestdb;
Databasechanged
mysql>call user_count();
+----------+
| count(*) |
+----------+
|        3 |
+----------+
1 row in set (0.00sec)
Query OK, 0 rows affected (0.00 sec)

发现可以查询出来了,因为user1对存储过程user_count有执行的权限,虽然它依旧没有权限直接操作mysql库,由于我们定义的SQL SECURITY为DEFINER,所以在执行时是以root的身份执行的,所以可以正常查询出来。

如果方便修改mysql中所有已经定义到的definer?

由于前期在测试库上开发的缘故,我们经常定义到的definer为`root`@`%`,后来搬移到生产库上又得改回来,存在着大量的更新,上百个的视图,函数等一个个改不免太麻烦并且也可能遗漏。如下为总结出的方便修改所有definer的方法,可以直到查漏补缺的作用。

现在在mysql涉及的definer有view、trigger、function、procedure、event。我们一个个作介绍。

1.修改function、procedure的definer

select definer from mysql.proc; -- 函数、存储过程

update mysql.proc set definer='user@localhost'; -- 如果有限定库或其它可以加上where条件

2.修改event的definer

select DEFINER from mysql.EVENT; -- 定时事件

update mysql.EVENT set definer=' user@localhost ';

3.修改view的definer

相比function的修改麻烦点:

select DEFINER from information_schema.VIEWS;

select concat("alter DEFINER=`user`@`localhost` SQL SECURITY DEFINER VIEW ",TABLE_SCHEMA,".",TABLE_NAME," as ",VIEW_DEFINITION,";") from information_schema.VIEWS where DEFINER<>'user@localhost';

查询出来的语句再执行一遍就好了。

4.修改trigger的definer

目前还没有具体方便的方法,可以借助工具端如HeidiSQL、sqlyog等来一个个修改。注意改前有必要锁表,因为如果改的过程中有其它表改变而触发,会造成数据不一致。

Flush tables with readlock

Unlock tables

如果有找到方法的方法,记得留言,相互学习。

免责声明:文章转载自《mysql如何修改所有的definer》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇账号系统登录流程QNX 实时操作系统(Quick Unix)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

docker 部署 mysql8 的 docker-compose 文件编写

version: '3.4' services: mysql: image: mysql:8.0.15 container_name: platform.mysql.23306 deploy: resources: limits: memory: 3g...

使用SyncNavigator轻松实现数据库异地同步、断点续传、异构同步

最近一直在研究数据库同步的问题,在网上查了很多资料,也请教了很多人,找到了一种通过快照复制的方法。研究了一番后发现之前就是用的这个方法,效果不是很好,果断放弃。经过了一番寻觅和他人指点,最后从一位热心网友那里得知一款很好用的软件—— SyncNavigator。 好东西就要拿出来跟大家分享,所以今天向大家介绍一下这款软件,及其一些使用方法。下面先看看它有...

mac mysql 使用注意事项

mac mysql 使用注意事项 1、安装 直接通过下载官网上的dmg安装包进行安装,mysql-5.5.49-osx10.8-x86_64(我的安装文件) ,安装完成后在系统偏好设置里面有mysql选项,我们可以通过这个启动和停止mysql服务器,默认安装在了 /usr/local/mysql 目录 2、启动 通过系统偏好设置启动项启动...

centos lamp/lnmp阶段复习 以后搬迁discuz论坛不需要重新安装,只需修改配置文件即可 安装wordpress 安装phpmyadmin 定时备份mysql两种方法 第二十五节课

centos  lamp/lnmp阶段复习 以后搬迁discuz论坛不需要重新安装,只需修改配置文件即可 安装wordpress  安装phpmyadmin  定时备份mysql两种方法  第二十五节课 wordpress下载地址:https://cn.wordpress.org/ 架构:nginx代理 +LAMP 修改Windows的hosts文件 ap...

Tomcat服务器

Tomcat 一、Tomcat简介 Tomcat是Apache软件基金会(ApacheSoftwareFoundation)的Jakarta项目中的一个核心项目,由Apache,Sun和其他一些公司及个人共同开发而成。 Tomcat服务器是一个免费的开放源代码的Web应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是...

Mysql Tips -- 显示执行SQL耗时,精确到毫秒

MySQL执行一个SQL语句时,执行时间精确到秒。如下: mysql> select * from test +----+-------+ | id | name | +----+-------+ | 1 | david | +----+-------+ 1 row in set (0.00 sec) 如何精确到毫秒呢?MySQL有个内置语句...