mysql definer设置为root_mysql如何修改所有的definer
mysql中的definer是什么,有什么作用?
我们在mysql创建view、trigger、function、procedure、event时都会定义一个Definer=‘xxx’,类似如下:
CREATEALGORITHM=UNDEFINED
DEFINER= `root`@`%` SQL SECURITY DEFINER
VIEW `v_ questions` AS
SELECT`q`.`id`AS`id`,
`q`.`title`AS`title`FROMTest q;
或者像这样的:CREATE DEFINER=`root`@`%` PROCEDURE`user_count`()
LANGUAGE SQLNOTDETERMINISTICCONTAINSSQL
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 SQLNOTDETERMINISTICCONTAINSSQL
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();
ERROR1142 (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 [email protected]; -- 如果有限定库或其它可以加上where条件
2.修改event的definer
select DEFINER from mysql.EVENT; -- 定时事件
update mysql.EVENT set definer=‘ [email protected] ‘;
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<>[email protected];
查询出来的语句再执行一遍就好了。
4.修改trigger的definer
目前还没有具体方便的方法,可以借助工具端如HeidiSQL、sqlyog等来一个个修改。注意改前有必要锁表,因为如果改的过程中有其它表改变而触发,会造成数据不一致。
Flush tables with readlock
Unlock tables
如果有找到方法的方法,记得留言,相互学习。
原文:http://www.cnblogs.com/zejin2008/p/4767531.html
mysql definer设置为root_mysql如何修改所有的definer相关推荐
- mysql批量设置属性_for 循环修改 model.Schema 实体的某个属性值(这个属性是一个索引,不可重复),批量插入数据库...
在写demo的时候,我需要使用for循环修改一个model 实体的索引的值,伪造数据批量插入Collection. var epsonl_1 = new Epsonl({ NAME: '', CONT ...
- mysql如何修改所有的definer
mysql中的definer是什么,有什么作用? 我们在mysql创建view.trigger.function.procedure.event时都会定义一个Definer='xxx',类似如下: C ...
- ubuntu下mysql编码格式设置_Ubuntu 16.04.1下修改MySQL默认编码
在写Android程序的时候,使用中文传递数据时,SQL查询总是得不到结果,经过调试,request.getparameter可以得到中文结果,并且输入的SQL语句经检验没有问题,而且,使用非中文的时 ...
- Mysql设置初始化密码和修改密码
转自:Mysql设置初始化密码和修改密码 刚开始创建mysql的时候,一般需要修改密码:而且,本人碰到过在几台服务器上面操作,忘记了其中一台的root密码(用户密码记得,root特别久没用了), ...
- mysql设置索引长度_修改Mysql索引长度限制
mysql 索引过长1071-max key length is 767 byte 问题 create table: Specified key was too long; max key lengt ...
- Mysql时区设置最佳实践,mysql设置时区_修改MySQL时区设置的方法
摘要 腾兴网为您分享:修改MySQL时区设置的方法,一直播,一点开,小猿口算,汤圆等软件知识,以及都优乐,daysmatter,乐学高考app,随缘漂流瓶,虚拟软件,平安知鸟,智能证件照app,新概念 ...
- xampp默认mysql密码设置,修改mysql的默认空密码
以前开发我一直都是用的appserv,appserv的特点就是一键安装,安装的时候会要求用户输入mysql的root密码.今天我改用xampp作为我的开发环境,所以碰到了修改mysql默认空密码的问题 ...
- mysql关于时间的面试题,mysql时间设置默认值MySQL常见面试题
1.limit(选出10 到20 条) select * from students order by id limit 9,10; 2.MySQL 会使用索引的操作符号 =,>,=,betwe ...
- window mysql安全设置_mysql安全配置方案
1 限制访问mysql端口的ip windows可以通过windows防火墙或者ipsec来限制,linux下可以通过iptables来限制. 2 修改mysql的端口 windows下可以修改配置文 ...
最新文章
- 【Java小工匠聊密码学】-密码学--综述
- 用Visio制作周行事历
- 技术人员,你拿什么拯救你的生活----温水煮青蛙
- pip安装包一直提示找不到
- VC操作MySQL数据库
- 实用简洁的问答/社区系统
- 复练-软考网规-机房建设规范专题
- max open files mysql_MySQL 重启提示超出可打开文件数限制|Buffered warning: Changed limits: max_open_files: 1024...
- IntelliJ IDEA设置TortoiseSVN插件(Cannot run program svn)
- pytorch之深度学习
- HCNP学习笔记:OSPF报头及各种报文格式
- 十三、Oracle学习笔记:decode函数、排序函数和高级分组函数
- linux shell读取文件,shell脚本中读取文件的方法
- 树莓派摄像头模块(Pi Cam)的安装使用
- 八类网线和七类网线的区别_7类网线和8类网线到底有何不同?
- 基础平面设计(文字排版篇)
- todo已完成任务_总结一下TODO的用法
- 前端车牌识别SDK算法提取
- PHP file_get_contents函数详解
- Bmob后端云使用步骤