mysql修改所有字段_详解mysql数据库如何一键修改所有已经定义到的definer

本文详细介绍了MySQL中存储过程、函数、触发器、视图和事件的DEFINER与INVOKER权限的区别。DEFINER指定按定义者权限执行,INVOKER则按调用者权限执行。通过实例展示了当存储过程权限设置不当导致的问题,并提供了批量修改DEFINER的SQL语句,帮助用户更有效地管理和维护数据库权限设置。
摘要由CSDN通过智能技术生成

概述

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

ce546cc6b080705d0b5af742d220a3b3.png

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

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

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


DEFINER/INVOKER区别

1、创建一个definer存储过程

79edb98850dc1155d969a7a2a400cc83.png

用root帐号登陆:

8475265b74b6d70636dafe0a24a7638d.png

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

2、修改为invoker存储过程

357ed4aeb94cb8c08ed5a95579ce8d5f.png

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


修改mysql中所有已经定义到的definer

因为开发经常用root来创建函数或者创建存储过程,定义到的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 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值