2010-04-19 79 views
17

我写的所有的MySQL的程序为[email protected]创建存储过程时需要“定义者”吗?

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

麻烦的是,部署到另一台服务器的时候,我有当前用户更换root,并与当前的IP,这是恼人的更换localhost

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

回答

13

在MySQL文档中所述here

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

因此,定义者的部分是不是强制性的,只是CREATE PROCEDURE应该工作。

+0

它说:“定义者子句决定在触发启动时检查访问权限时要使用的安全上下文的更多细节将在本节后面给出。” 因此,当我确定,程序仅用于特权用户,我可以完全删除整个定义的东西? – Xorty 2010-04-19 09:18:12

+0

是的,我想。我认为,当你定义用户的权限有一个“执行程序”权限,可以授予/拒绝(不知道这个...) – maid450 2010-04-19 10:04:55

+0

好,我会稍后尝试,如果它的工作回应。 Thanx – Xorty 2010-04-19 10:13:54

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

检查它..也许这会帮助你,如果你想在你的过程来定义用户...

+2

你有可能解释属性DEFINER吗? %意味着 - 它允许任何用户从任何IP地址? PLS。回复我。 我使用的是自动创建DEFINER的godaddy共享主机,我们无法将其删除。它被称为DEFINER = [数据库名称] @%,但它不允许我从本地Windows应用程序传递存储过程;但我可以沟通,如果我使用正常查询(如:select * from tablenm ...) 任何人都可以帮助我在这方面 - 请。 – Sensa 2012-04-24 12:35:15

0

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

SQL SECURITY INVOKER 

实施例:

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

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