mysql 存储过程权限问题

协助开发导入库时,他提醒我,库里有存储过程的定义。我使用了--routines 的选项,可是导入时,出了问题:

1.提示无法创建该存储过程,原来是忘了打开 log_bin_trust_function_creators 变量,

set global log_bin_trust_function_creators=on; 后,成功创建,从服务器也需要此操作

才行,如果二进制日志是 ROW 的话,即使从上有此存储过程,也是不会调用的。

2.等到导入成功后,却又出现了无法调用的问题,搜索了 http://www.2cto.com/database/201403/288436.html 这篇文章,记录下此问题。

  1. 创建一个 definer 为 user_admin 的存储过程
mysql> DELIMITER //
mysql> CREATE DEFINER=‘user_admin‘ PROCEDURE num1()
    -> BEGIN
    -> SELECT COUNT(id) FROM itopserver;
    -> END //
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> DELIMITER ;

2. 创建一个用户,并赋于其 相关权限

mysql> create user user_itop identified by ‘123456‘;
Query OK, 0 rows affected (0.00 sec)
mysql> grant select,insert,delete,update on itop.* to ‘user_test‘@‘%‘;
Query OK, 0 rows affected (0.00 sec)

mysql> show grants for [email protected]‘%‘;
+---------------------------------------------------------------------+
| Grants for [email protected]%                                              |
+---------------------------------------------------------------------+
| GRANT USAGE ON *.* TO ‘user_test‘@‘%‘                               |
| GRANT SELECT, INSERT, UPDATE, DELETE ON `itop`.* TO ‘user_test‘@‘%‘ |
+---------------------------------------------------------------------+
2 rows in set (0.00 sec)

3. 使用 user_test 连接 mysql 并执行刚才创建的 procedure

mysql> call num1;
ERROR 1370 (42000): execute command denied to user ‘user_test‘@‘%‘ for routine ‘itop.num1‘

4. 这样看是权限的问题,因为只给了他操作表的方法。 增加其 itop 的 execute 权限

mysql> grant execute on itop.* to [email protected]‘%‘;
Query OK, 0 rows affected (0.00 sec)

mysql> show grants for [email protected]‘%‘;
+----------------------------------------------------------------------------------------------------------+
| Grants for [email protected]%                                                                                   |
+----------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO ‘user_test‘@‘%‘ IDENTIFIED BY PASSWORD ‘*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9‘ |
| GRANT SELECT, INSERT, UPDATE, DELETE, EXECUTE ON `itop`.* TO ‘user_test‘@‘%‘                             |
+----------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

5. 重新使用此用户连接 Mysql 执行刚才定义的存储过程

mysql> use itop;
mysql> call num1();
ERROR 1449 (HY000): The user specified as a definer (‘user_admin‘@‘%‘) does not exist

现在可以调用该存储过程了,但是提示存储过程定义中的definer不存在,

原来仅仅是连接到MySQL服务器的用户具有执行存储过程的权限是远远不够的,

最终要通过存储过程定义中指定的definer来执行存储过程。

6. 说 user_admin 不存在,那就创建 user_admin 这个用户

mysql> grant select,insert,delete,update on itop.* to ‘user_admin‘@‘%‘ identified by ‘123456‘;
Query OK, 0 rows affected (0.00 sec)

mysql> show grants for [email protected]‘%‘;
+-----------------------------------------------------------------------------------------------------------+
| Grants for [email protected]%                                                                                   |
+-----------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO ‘user_admin‘@‘%‘ IDENTIFIED BY PASSWORD ‘*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9‘ |
| GRANT SELECT, INSERT, UPDATE, DELETE ON `itop`.* TO ‘user_admin‘@‘%‘                                      |
+-----------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

7. 重新使用 "user_test" 用户连接 Mysql 执行刚才定义的存储过程

mysql> use itop;
mysql> call num1();
ERROR 1370 (42000): execute command denied to user ‘user_admin‘@‘%‘ for routine ‘itop.num1‘

8. 看来不仅仅是连接到MySQL服务器的用户需要具有存储过程上的执行权限,存储过程定义者同样需要该权限。

mysql> grant execute on itop.* to ‘user_admin‘@‘%‘;
Query OK, 0 rows affected (0.00 sec)

mysql> show grants for user_admin;
+-----------------------------------------------------------------------------------------------------------+
| Grants for [email protected]%                                                                                   |
+-----------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO ‘user_admin‘@‘%‘ IDENTIFIED BY PASSWORD ‘*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9‘ |
| GRANT SELECT, INSERT, UPDATE, DELETE, EXECUTE ON `itop`.* TO ‘user_admin‘@‘%‘                             |
+-----------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

9. 重新使用 "user_test" 用户连接 Mysql 执行刚才定义的存储过程

mysql> use itop;
mysql> call num1();
+-----------+
| COUNT(id) |
+-----------+
|       372 |
+-----------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)

可以执行了

时间: 2024-10-24 21:34:29

mysql 存储过程权限问题的相关文章

MySQL存储过程详解 mysql 存储过程

MySQL存储过程详解  mysql 存储过程 (2010-12-13 10:59:38) 转载▼ 标签: it 分类: mysql mysql存储过程详解 1.      存储过程简介   我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它. 一个存储过程是一个可编程的函数,它在数据库中创建并保

MySQL之权限管理

MySQL权限简介 权限简单的理解就是mysql允许权力以内的事情,不可越界.比如只允许执行select操作,那么就不能执行update操作.只允许从某台机器上连接mysql,那么就不能从除那台机器以外的其他机器连接mysql. 那么Mysql的权限是如何实现的呢?这就要说到mysql的两阶段验证,下面详细介绍: 第一阶段:服务器首先会检查是否允许连接.因为创建用户的时候会加上主机限制,可以限制成本地.某个IP.某个IP段.以及任何地方等,只允许从配置的指定地方登陆. 第二阶段:如果能连接,My

MYSQL存储过程和函数学习笔记

学至Tarena金牌讲师何山,金色晨曦科技公司技术总监沙利穆课程笔记的综合. 1. 什么是存储过程和函数 将SQL语句放入一个集合里,然后直接调用存储过程和函数来执行已经定义好的SQL语句,通过存储过程和函数,可以避免开发人员重复编写相同的SQL语句. MYSQL存储过程和函数是保存在服务器中,在服务器中存储和执行,可以减少客户端和服务器端之间数据传输的消耗. 存储过程就是一组已经保存在数据库中的语句,并且可以随时地调用. 存储过程允许标准组件式编程,存储过程在被创建以后可以在程序中被多次调用而

MySQL存储过程详解 mysql 存储过程(转:http://blog.sina.com.cn/s/blog_52d20fbf0100ofd5.html)

转:http://blog.sina.com.cn/s/blog_52d20fbf0100ofd5.html mysql存储过程详解 1.      存储过程简介   我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它. 一个存储过程是一个可编程的函数,它在数据库中创建并保存.它可以有SQL语句和

当PHP遇到MySQL存储过程

1.MySQL存储过程 我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它. 一个存储过程是一个可编程的函数,它在数据库中创建并保存.它可以有SQL语句和一些特殊的控制结构组成.当希望在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是非常有用的.数据库中的存储过程可以看做是对编

mysql用户权限管理

mysql数据在实际生产环境中大量被使用,那平时在做好服务器上防火墙策略以外平时,对mysql下的用户权限也要严格管理,mysql的用户权限都是放在mysql.user这张表里,平时的用户权限管理都是隐式使用着这张表的,先说下权限: 权限 意义 select 查询 insert 插入 update 更新 delete 删除记录,一般用于清空表或者某一条记录 create 创建 drop 删除,从表空间里删除 grant 授予,一般用于给用户授权 references 引用 index 索引 al

MySQL 用户权限详细汇总(转)

1,MySQL权限体系 MySQL 的权限体系大致分为5个层级: 全局层级: 全局权限适用于一个给定服务器中的所有数据库.这些权限存储在mysql.user表中.GRANT ALL ON .和REVOKE ALL ON .只授予和撤销全局权限. 数据库层级: 数据库权限适用于一个给定数据库中的所有目标.这些权限存储在mysql.db表中.GRANT ALL ON db_name.和REVOKE ALL ON db_name.只授予和撤销数据库权限. 表层级: 表权限适用于一个给定表中的所有列.这

mysql存储过程详解

1.      存储过程简介   我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它. 一个存储过程是一个可编程的函数,它在数据库中创建并保存.它可以有SQL语句和一些特殊的控制结构组成.当希望在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是非常有用的.数据库中的存储过程可以

Mysql grant权限管理

MySQL 赋予用户权限命令的简单格式可概括为: grant 权限 on 数据库对象 to 用户 [identified by '密码'] 最常用的,弄主从同步的时候,给从库的slave用户设置拥有所有权限,权限all 仅允许其从192.168.0.2登录,并限定使用密码 funsion (密码要用 单/双引号 括起来) grant all on *.* to slave@192.168.0.2 identified by 'funsion'; 执行完毕后,记得用 FLUSH PRIVILEGE