在以下例子中, 出现 definer 于 sql security invoker, 导致不解, 遂学习一翻.
- # 创建存储过程
- DELIMITER $$
- CREATE DEFINER = Hider@localhost PROCEDURE p(vRows INT)
- SQL SECURITY INVOKER
- BEGIN
- WHILE vRows> 0 DO
- INSERT tb(VALUE) VALUES(NOW());
- SET vRows = vRows - 1;
- END WHILE;
- END $$
- DELIMITER ;
procedure 于 function,trigger 等在创建的时候, 紧接着 create 都有个 definer 可选项, 该 definer 规定了访问该 procedure 等的安全控制.
一, DEFINER
例如上面的例子中, 指定 definer 为用户 Hider@localhost, 所以任意用户 A 访问该 PROCEDURE 时, 能否成功取决于 A 是否有调用该 PROCEDURE 的权限, 以及 definer 是否有 procedure 中的 SELECT 的权限.
二, SQL SECURITY
DEFINER 默认为当前用户, 也可指定其他用户. 如果想通过访问者来判断是否具有访问该 PROCEDURE 的权限, 则可用 SQL SECURITY 指定.
- DELIMITER $$
- CREATE DEFINER = Hider@localhost PROCEDURE p(vRows INT)
- SQL SECURITY INVOKER
- BEGIN
- BODY
- END $$
- DELIMITER ;
该示例虽然指定了 DEFINER , 但同时也指定了 SQL SECURITY 类型为 INVOKER ,SQL SECURITY 优先级高, 所以安全类型为 INVOKER, 用户能否访问取决于用户是否有执行该 PROCEDURE 的权限及该 PROCEDURE 中的 SELECT 权限 (与 select 操作的表有关).
当然, 也可用 SQL SECURITY 指定 DEFINER:SQL SECURITY DEFINER
END 2018-05-29 00:35:10
来源: http://www.bubuko.com/infodetail-2621921.html