• 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; -- 定时事件

    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号,姓名...小工具类汇总
    简单的时间格式转换工具类(java)
    判断某个时间点在一个时间段内方法汇总
    AES加密解密代码(key是16位)--java
    Linux下查看CPU、内存、磁盘信息
    idea如何优雅部署项目到weblogic
    weblogic部署项目
    程序员必知的十大基础实用算法及其讲解
    Java开发工具包 ==> Hutool
    java基础-泛型举例详解
  • 原文地址:https://www.cnblogs.com/elontian/p/9122663.html
Copyright © 2020-2023  润新知