MySQL定义数据库对象之指定definer
mysql创建view、trigger、function、procedure、event时都会定义⼀个Definer:
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执⾏存储过程。
修改mysql中所有已经定义到的definer?
由于前期在测试库上开发的缘故,我们经常定义到的definer为`root`@`%`,后来搬移到⽣产库上⼜得改回来,存在着⼤量的更新,上百个的视图,函数等⼀个个改不免太⿇烦并且也可能遗漏。
如下为总结出的⽅便修改所有definer的⽅法,可以直到查漏补缺的作⽤。
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; -- 定时事件
mysql存储过程使用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

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。