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

Xor*_*rty 27 mysql stored-procedures

我把所有的MySQL程序写成root@localhost:

CREATE DEFINER=`root`@`localhost` PROCEDURE `p_add_user`(...)
Run Code Online (Sandbox Code Playgroud)

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

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

mai*_*450 21

在MySQL文档中所述这里

CREATE
[DEFINER = { user | CURRENT_USER }]
PROCEDURE sp_name ([proc_parameter[,...]])
[characteristic ...] routine_body
Run Code Online (Sandbox Code Playgroud)

因此,DEFINER部分不是强制性的,只是CREATE PROCEDURE应该有效.

  • 嗨,DEFINER属性杀了我......让我知道如何删除这个?它在我创建新程序时自动创建...我正在使用godaddy共享主机. (3认同)
  • 同样的问题,Definer是一个杀手.如何在没有定义器的情况下添加程序? (3认同)
  • 这会将定义者设置为当前用户。根据MySQL文档[用于存储程序和视图的访问控制](http://dev.mysql.com/doc/refman/5.0/en/stored-programs-security.html):“所有存储程序(过程,函数,触发器和触发器)和视图可以具有用于命名MySQL帐户的DEFINER属性。如果存储程序或视图定义中省略了DEFINER属性,则**默认帐户是创建对象的用户**。” (2认同)

Rio*_*Rio 5

[编辑:更新参考页面]

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

SQL SECURITY INVOKER
Run Code Online (Sandbox Code Playgroud)

例子:

CREATE DEFINER=`root`@`localhost` PROCEDURE `p_add_user`()
SQL SECURITY INVOKER
(...)
Run Code Online (Sandbox Code Playgroud)

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