• MySQL 授权用户 ; 存储过程的DEFINER; 命令分隔符DELIMITER


    最近项目中遇到有人使用DEFINER这样的关键字,找了半天没有怎么理解这个意思。以为是限制谁使用这个存储过程,后来测试发现并不是这样。

    搜索网上发现很多说法都不正确。看到一篇博客,做了如下介绍,才有所理解。原来是这样。由于记录一下,转载过来。

    1. MySQL的用户名都是username@hostname的形式

    2. 授权用户的命令:
      mysql >grant all privileges on *.* to root@"%" identified by "123" // 123是密码

      mysql >flush privileges

    以上命令授权root@%用户所有权限,如果root@%用户不存在,则自动创建该用户。也可以借助于Navigate工具设

    置。

    如果要使新建的帐户也具备建帐户的权限,则要这样:

    mysql >grant all privileges on *.* to root@"%" identified by "123"  with grant option;

    3. root@%的意思是允许在任何机器上以root用户访问数据库,也就是说只要数据库存在名为root@%的用户,则

    root在任何机器上都可以访问数据库,否则,如果数据库不存在root@%用户,则只有被授权了用户名可以访问数

    据库,被授权的用户可以通过Navigate工具查看。
    4. 存储过程中有个DEFINER
    (1) DEFINER的意思是“定义者”,也就是指明此存储过程有哪个用户定义的,它跟存储过程的使用权限无关;

    可以说,存储和过程是没有使用限制的,任何人都可以使用存储过程,那么为什么还要加上DEFINER指定存储过

    程的定义者呢,因为,存储过程虽然不限制任何人使用,但是它本身的行为必须受到权限限制,也就是存储过程

    本身内部具备哪些对数据库的访问权限,而这访问权限便是DEFINER用户对数据库的访问权限。
    (2) DEFINER被定义为一个普通的username@hostname用户就不必说了,如果定义为root@%,有什么特别的吗?没

    有。只不过数据库中要存在root@%用户,否则创建的时候没事,调用的时候就提示root@% is not registered,

    也就是用户不存在。
    (3) DEFINER也可以省略掉,这样存储过程默认的定义者是root@localhost,而一般数据库在安装的时候都会有

    一个root@localhost用户,所以,该存储过程也能正常在不同的机器上被使用。
    5. 既然上述存储过程任何人都以访问,那么它本身运行时的访问权限怎么限制呢。可以通过SQL SECURITY 

    INVOKER ,也就是,其本身的访问权限由调用者权限设置。
    6.命令分隔符DELIMITER

    MySQL默认是以分号作为两个命令的分割点的。但有些命令块中包含分号,比如存储过程或触发器的定义中。为了使MySQL不把命令块中的分号误认做命令的分割点,需要在执行这种命令块前临时改一下命令分隔符。尤其注意,SQLYog里面写存储过程的时候,必须自行定义命令分隔符。

    转载自:http://blog.csdn.net/dyzhen/article/details/6681438

  • 相关阅读:
    Linux文件目录结构详解
    Linux常用命令学习
    51Nod 1094 和为k的连续区间 | 水
    (转) jsp学习笔记
    Hadoop到底能做什么?怎么用hadoop?
    51Nod 1092 回文字符串 | 最长公共子序列变形
    51Nod 1067 Bash游戏 V2 | 博弈论 Bash
    51Nod 1062 序列中最大的数 | 简单DP
    51Nod 1050 循环数组最大子段和 | DP
    HDU 5643 King's Game | 约瑟夫环变形
  • 原文地址:https://www.cnblogs.com/furenjian/p/11410584.html
Copyright © 2020-2023  润新知