【发布时间】:2011-02-09 14:41:06
【问题描述】:
我已将所有 MySQL 程序编写为 root@localhost:
CREATE DEFINER=`root`@`localhost` PROCEDURE `p_add_user`(...)
麻烦的是,当部署到另一台服务器时,我必须将root替换为当前用户,并将localhost替换为当前IP,这很烦人。
有没有什么方法可以编写程序,让想要使用我的数据库和程序的人不必修改每个程序的定义器?
【问题讨论】:
我已将所有 MySQL 程序编写为 root@localhost:
CREATE DEFINER=`root`@`localhost` PROCEDURE `p_add_user`(...)
麻烦的是,当部署到另一台服务器时,我必须将root替换为当前用户,并将localhost替换为当前IP,这很烦人。
有没有什么方法可以编写程序,让想要使用我的数据库和程序的人不必修改每个程序的定义器?
【问题讨论】:
如 MySQL 文档中所述 here
CREATE
[DEFINER = { user | CURRENT_USER }]
PROCEDURE sp_name ([proc_parameter[,...]])
[characteristic ...] routine_body
因此,DEFINER 部分不是强制性的,只需 CREATE PROCEDURE 即可。
【讨论】:
[编辑:更新的参考页面]
您可以通过在过程主体中(声明后)添加以下语句来指定执行权限:
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-objects-security.html
【讨论】:
CREATE DEFINER=[your_web_user]@% PROCEDURE p_add_user(...)
检查一下。如果您想在程序中定义用户,这可能会对您有所帮助...
【讨论】: