MySQL 设置存储过程 权限认证

来源:互联网 发布:apache ant 是什么 编辑:程序博客网 时间:2024/09/21 08:56

1、root用户登录创建存储过程并授予helong@localhost执行存储过程权限

mysql -uroot


delimiter //

CREATE PROCEDURE simproc_definer (OUT param1 INT)

SQL SECURITY DEFINER

BEGIN

SELECT COUNT(*) INTO param1 FROM aaa;

END//

CREATE PROCEDURE simproc_invoker (OUT param1 INT)

SQL SECURITY INVOKER

BEGIN

SELECT COUNT(*) INTO param1 FROM aaa;

END//

CREATE PROCEDURE simproc_default (OUT param1 INT)

BEGIN

SELECT COUNT(*) INTO param1 FROM aaa;

END//

delimiter ;


grant execute on procedure test.simproc_definer to helong@localhost;

grant execute on procedure test.simproc_invoker to helong@localhost;

grant execute on procedure test.simproc_default to helong@localhost;


2、helong@localhost登录,执行存储过程

mysql -uhelong

(helong:Thu Jan 6 15:02:41 2011)[(none)]> CALL test.simproc_definer(@a1);

Query OK, 0 rows affected (0.00 sec)


(helong:Thu Jan 6 15:02:56 2011)[(none)]> CALL test.simproc_invoker(@a2);

ERROR 1142 (42000): SELECT command denied to user 'helong'@'localhost' for table 'aaa'


(helong:Thu Jan 6 15:02:56 2011)[(none)]> CALL test.simproc_default(@a3);

Query OK, 0 rows affected (0.00 sec)


(helong:zw_75.58:Thu Jan 6 15:02:57 2011)[(none)]> SELECT @a1,@a2,@a3;

+------+------+------+

| @a1 | @a2 | @a3 |

+------+------+------+

| 8 | NULL | 8 |

+------+------+------+

1 row in set (0.00 sec)


3、总结

(1)MySQL存储过程是通过指定SQL SECURITY子句指定执行存储过程的实际用户;


(2)如果SQL SECURITY子句指定为DEFINER,存储过程将使用存储过程的DEFINER执行存储过程,

验证调用存储过程的用户是否具有存储过程的execute权限和DEFINER用户是否具有存储过程引用的相关对象的权限;


(3)如果SQL SECURITY子句指定为INVOKER,那么MySQL将使用当前调用存储过程的用户执行此过程,

并验证用户是否具有存储过程的execute权限和存储过程引用的相关对象的权限;


(4)如果不显示的指定SQL SECURITY子句,MySQL默认将以DEFINER执行存储过程。

原创粉丝点击