问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

mysql 存储过程 definer可以删除吗

发布网友 发布时间:2022-04-08 08:59

我来回答

2个回答

懂视网 时间:2022-04-08 13:21

我们在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
 NOT DETERMINISTIC
 CONTAINS SQL
 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
 NOT DETERMINISTIC
 CONTAINS SQL
 SQL SECURITY INVOKER
 COMMENT ‘‘
BEGIN
 select count(*) from mysql.user;
END$$
DELIMITER ;

 

 

用root帐号登陆:

mysql> use testdb;
Database changed
mysql> call user_count();

+----------+
| count(*) |
+----------+
| 3 |
+----------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)
可以正常查询出来。

我们再用user1进行登陆:

mysql> use testdb;
Database changed
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> use testdb;
Database changed
mysql> call user_count();
+----------+
| count(*) |
+----------+
| 3 |
+----------+
1 row in set (0.00 sec)
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

标签:

热心网友 时间:2022-04-08 10:29

【存储过程的权限】
ALTER ROUTINE 编辑或删除存储过程
CREATE ROUTINE 创建存储过程
EXECUTE运行存储过程

【存储过程的创建语法】
delimiter // -- 声明分隔符(命令结束符)

create

definer = user@hostname | current_user

procere 存储过程名 (参数)
comment '注释'
sql security definer | invoker -- sql 的安全设置

begin
存储过程的body
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
便携式发电机十大名牌 冬天夜跑同时锻炼身体和意志的句子锦集 冬天的时候跑步可以达到46~60分钟 可是夏天了跑步25分钟左右就已经感觉... 孩子病毒性感冒咳嗽厉害怎么办 严重的病毒性感冒几天能好 宝宝六个月因为病毒性感冒而咳嗽有痰可每次咳嗽出来的痰他吐不出来怎 ... ios购买的app怎么退款 求助!书法高手!用什么书法来“魏亮”这二字最漂亮? 万事胜意,喜乐长安繁体 什么叫喜乐长安 新生儿擦完按摩油能再擦润肤霜吗 怀孕能用积雪草的护肤品吗? 油皮适合用云朵艾杨的积雪草水嫩宝宝乳吗? 什么肤质不能用积雪草 云朵艾杨积雪草水嫩宝宝乳过敏肌肤可不可以用? 朋友送了一瓶欧莱雅积雪草面霜,想知道适合什么年龄使用? 有人用过云朵艾杨的积雪草水嫩宝宝乳吗?感觉怎么样呀? 云朵艾杨家的积雪草水嫩宝宝乳适合宝宝用吗? 求问云朵艾杨积雪草水嫩宝宝乳怎么样?滋润度高吗? 海龟爸爸积雪草面霜敏感肌肤可以用吗 想给宝宝买润肤乳,种草了云朵艾杨的积雪草水嫩宝宝乳,这个有人用过吗? 谁有《一生有你》的纯音乐版伴奏 下载彩铃《一生有你》 mp3可以在手机上下载歌曲吗 水木年华的全部歌曲 哪有下载女声版的《一生有你》? 请问哪里有MTV“一生有你”可下载? 谁有 水木年华-一生有你 的高清晰mv 下载地址? 水木年华《一生有你》歌词, 谁知道《一生有你》的歌曲链接 window7的IE64不能收看CNTV的体育直播??? 为什么使用爱思助手无法安装软件? 最全的体育直播软件 .笔记本电脑win10系统下载和安装了软件,卓面有安装的图标,如爱思助手,一点击显示安装? 看体育直播下载什么好 哪里有纬来体育台或卫视体育台转播的NBA比赛的下载,不要在线看的 求一张小心超人和伽罗的图,小心穿黑色风衣 小心超人和伽罗这图 小心超人和伽罗这图是咋整 伽罗送小心超人礼物是哪一集 在开心宝贝第五部---开心星星球中,那一集小心超人背着伽罗?如图: 《开心宝贝》里为什么伽罗跟着小心超人? 开心宝贝里,伽罗怕痒吗?小心超人的怪笑是真的笑还是装出来的? 小心超人和伽罗不变身谁厉害 《小心超人》与《伽罗》关系官方解释是什么? 小心超人被伽罗抱了几次 小心超人和伽罗到底是什么关系? 《小心超人》与伽罗关系官方解释是什么? 王者荣耀可以用微信充值么 微信充值教程 小心超人和伽罗的日常生活