创建存储过程时需要`definer`吗?

时间:2010-04-19 09:02:59

标签: mysql stored-procedures

我已将所有MySQL程序编写为root@localhost

CREATE DEFINER=`root`@`localhost` PROCEDURE `p_add_user`(...)

麻烦的是,在部署到另一台服务器时,我必须用当前用户替换root并用当前IP替换localhost,这很烦人。

有没有办法编写程序,以便想要使用我的数据库和程序的人不必修改每个程序的定义者?

3 个答案:

答案 0 :(得分:18)

如MySQL文档中所述here

CREATE
[DEFINER = { user | CURRENT_USER }]
PROCEDURE sp_name ([proc_parameter[,...]])
[characteristic ...] routine_body

因此,DEFINER部分不是强制性的,只需要CREATE PROCEDURE。

答案 1 :(得分:1)

CREATE DEFINER=[your_web_user]@% PROCEDURE p_add_user(...)

检查它..如果你想在你的程序中定义用户,这可能会对你有所帮助......

答案 2 :(得分:1)

您可以通过在过程体中添加以下语句(声明后)来指定执行权限:

SQL SECURITY INVOKER

示例:

CREATE DEFINER=`root`@`localhost` PROCEDURE `p_add_user`()
SQL SECURITY INVOKER
(...)

这样做,将应用实际的调用者权限,并省略DEFINER部分(即使在模式导入期间自动添加它)。 完整参考: https://dev.mysql.com/doc/refman/5.7/en/stored-programs-security.html