处理请求时出错:在数据库'chamelis_wp'中找不到名为'daily_difference'的例程。您可能缺少编辑此例程所需的权限。
2uluyalo1#
如果你在cPanel下使用phpMyAdMin(pma),这个错误是由于cPanel为每个会话创建一个临时用户来登录pma,从而登录数据库。如果你在一个托管的环境中工作,* 你不能被授予SUPER权限 *,并且你正在创建例程,你就有麻烦了。请继续阅读。存储例程(过程和函数)有一个名为DEFINER的属性。它存储了“拥有”该例程的数据库用户的用户名。如果一个db用户打开了phpMyAdmin(pma)并创建一个新例程,而不显式声明DEFINER,DEFINER将使用当前用户名填充。只有具有SUPER权限的数据库用户才能创建例程并声明另一个用户作为DEFINER。非SUPER用户只能将自己声明为DEFINER,或者将其留空,由数据库为他们声明。因此,您登录时所用的数据库用户身份将成为您在该会话期间创建的所有例程的DEFINER。您遇到问题的原因是a.只有routine的DEFINER或具有SUPER权限的用户可以编辑或导出routine。如果(非SUPER)用户登录到pma并尝试编辑或导出现有routine,则除非他们是该routine的DEFINER,否则他们会收到您所看到的错误,并且他们无法访问该routine。b.即使您已经在cPanel中创建了数据库用户帐户,cPanel也不会使用其中任何一个来启动pma。在cPanel下,您将使用它生成的临时用户名自动登录。您不会看到pma登录页面-登录发生在屏幕外-您将直接进入pma主页。您无法控制所使用的用户名/密码。d.当您开始一个新的cPanel会话时(例如,在每天工作开始时),cPanel会更改用于登录到pma的临时数据库用户名。cPanel用户名都具有以下模式:“cpses_db...@localhost”,其中的点是填充的字母数字,如“hmxbj 8 s2”。我刚刚登录,pma主页告诉我当前数据库用户是“cpses_dbhmxbj8s2@localhost”。如果我关闭pma,注销cPanel,重新登录到cPanel,然后重新打开pma,这个新会话的数据库用户名是“cpses_db0z35t107@localhost”。e.如果我在上一个会话中创建了一个新例程,则该例程的定义符仍为“cpses_dbhmxbj8s2@localhost”。现在我以“cpses_db0z35t107@localhost”的身份登录,无法编辑或导出该例程。如果没有该例程的备份或副本,我将完全无法访问它(实际上,“orphaned”)。获取访问权限的唯一方法是在当前会话中使用不带DEFINER语句的脚本重新创建它,以便当前数据库用户成为DEFINER。该用户现在可以编辑例程。这意味着您每天都必须重新创建所有要处理的程序。如果您忘记导出在上一个会话中更改的所有例程,则您已经丢失了这些更改。f.另一个问题是,如果您还使用MySQL Workbench从外部连接到数据库,使用您创建的db用户登录,则除了编辑在pma下创建的任何例程外,您可以执行任何操作,因为这些例程将“cpses_db...”用户作为DEFINER。解决方案:1.如果cPanel中有这个选项,请在您的托管环境中安装您自己的pma副本。这必须安装在站点的public-html部分的一个文件夹中,这样您就可以直接从浏览器访问它,例如https://example.com/pmamyadmin/index.php。使用您为数据库创建的用户登录。此用户将成为您所有例程的定义者,只要您始终使用此用户名,您可以随时访问您的例程。(切勿使用cPanel的pma!)请注意,在您的站点的public_html部分中有一个pma的副本会带来安全问题。在pma的配置中一定要有密码,如果实际可行的话,可以使用.htaccess来限制对您的IP的访问,等等。但这是另一个主题。1.始终使用pma的本地副本或另一个客户端(如MySQL Workbench)从外部访问数据库(假设您的主机允许这样做)。最后1.如果这两种方法都不适合您,您必须使用cPanel的pma,那么在每个会话结束时导出所有例程并重新创建它们(没有DEFINER语句)。目前pma在例程导出函数中不包含DROP(对此有一个更改请求)所以你必须使用数据库导出来包含它们。除非你无论如何都想要完整备份,您只需要导出一个表的结构即可进行此导出。请确保在导出定义中单击“包括DROP...”和“包括例程...”。编辑导出以删除表定义,并将“DEFINER= cpses_db...@localhost“全局替换为“”然后在下一个会话中使用它重新创建例程。希望能有所帮助。
cpses_db...@localhost
zazmityj2#
听起来你没有权限编辑它,或者你试图从错误的数据库(模式)编辑它。运行下面的命令来查看它在哪个数据库上:显示函数状态,如“%daily %”;显示过程状态,如“%daily %”;您是想通过执行语句还是使用GUI来编辑它?如果是通过执行语句,您能提供您的语句吗?如果是通过语句,请确保您已经先运行了以下代码:请在此处使用db_name_;然后尝试再次编辑您的例程。该过程是由您的用户创建的,还是由其他用户创建的?您可能没有修改用户过程的权限。可以通过运行以下命令查看创建者:显示创建过程daily_difference;然后通过运行以下语句查看您是否具有编辑过程的权限-您需要“ALTER ROUTINE”权限:在此处显示您的用户名的授权;如果是由具有超级权限的用户创建的,则您将无法编辑它-您需要他们来编辑,或者您需要获得超级权限。
quhf5bfb3#
我回复部分是因为我有一个工作,部分是为了喜剧,因为GoDaddy给我发了这个页面,作为这个问题的解决方案,是的,这个问题是明确的,但没有,没有解决方案。我不得不在phpMyadmin中重建我的SP,但对于存在root@localhost的DEFINER,使用我创建的帐户,并可以使用- account@localhost。cPanel不公开root帐户AFAIK。我在其他地方没有我所有的SP定义。但是我发现在cPanel \ files \ backup \MySQL数据库中的文件有SP定义。这可能不在您的托管包中。从phpMyAdmin备份没有帮助,因为我仍然缺乏使用定义进行备份的权限。
3条答案
按热度按时间2uluyalo1#
如果你在cPanel下使用phpMyAdMin(pma),这个错误是由于cPanel为每个会话创建一个临时用户来登录pma,从而登录数据库。如果你在一个托管的环境中工作,* 你不能被授予SUPER权限 *,并且你正在创建例程,你就有麻烦了。请继续阅读。
存储例程(过程和函数)有一个名为DEFINER的属性。它存储了“拥有”该例程的数据库用户的用户名。如果一个db用户打开了phpMyAdmin(pma)并创建一个新例程,而不显式声明DEFINER,DEFINER将使用当前用户名填充。只有具有SUPER权限的数据库用户才能创建例程并声明另一个用户作为DEFINER。非SUPER用户只能将自己声明为DEFINER,或者将其留空,由数据库为他们声明。因此,您登录时所用的数据库用户身份将成为您在该会话期间创建的所有例程的DEFINER。
您遇到问题的原因是
a.只有routine的DEFINER或具有SUPER权限的用户可以编辑或导出routine。如果(非SUPER)用户登录到pma并尝试编辑或导出现有routine,则除非他们是该routine的DEFINER,否则他们会收到您所看到的错误,并且他们无法访问该routine。
b.即使您已经在cPanel中创建了数据库用户帐户,cPanel也不会使用其中任何一个来启动pma。在cPanel下,您将使用它生成的临时用户名自动登录。您不会看到pma登录页面-登录发生在屏幕外-您将直接进入pma主页。您无法控制所使用的用户名/密码。
d.当您开始一个新的cPanel会话时(例如,在每天工作开始时),cPanel会更改用于登录到pma的临时数据库用户名。cPanel用户名都具有以下模式:“cpses_db...@localhost”,其中的点是填充的字母数字,如“hmxbj 8 s2”。我刚刚登录,pma主页告诉我当前数据库用户是“cpses_dbhmxbj8s2@localhost”。如果我关闭pma,注销cPanel,重新登录到cPanel,然后重新打开pma,这个新会话的数据库用户名是“cpses_db0z35t107@localhost”。
e.如果我在上一个会话中创建了一个新例程,则该例程的定义符仍为“cpses_dbhmxbj8s2@localhost”。现在我以“cpses_db0z35t107@localhost”的身份登录,无法编辑或导出该例程。如果没有该例程的备份或副本,我将完全无法访问它(实际上,“orphaned”)。获取访问权限的唯一方法是在当前会话中使用不带DEFINER语句的脚本重新创建它,以便当前数据库用户成为DEFINER。该用户现在可以编辑例程。这意味着您每天都必须重新创建所有要处理的程序。如果您忘记导出在上一个会话中更改的所有例程,则您已经丢失了这些更改。
f.另一个问题是,如果您还使用MySQL Workbench从外部连接到数据库,使用您创建的db用户登录,则除了编辑在pma下创建的任何例程外,您可以执行任何操作,因为这些例程将“cpses_db...”用户作为DEFINER。
解决方案:
1.如果cPanel中有这个选项,请在您的托管环境中安装您自己的pma副本。这必须安装在站点的public-html部分的一个文件夹中,这样您就可以直接从浏览器访问它,例如https://example.com/pmamyadmin/index.php。使用您为数据库创建的用户登录。此用户将成为您所有例程的定义者,只要您始终使用此用户名,您可以随时访问您的例程。(切勿使用cPanel的pma!)
请注意,在您的站点的public_html部分中有一个pma的副本会带来安全问题。在pma的配置中一定要有密码,如果实际可行的话,可以使用.htaccess来限制对您的IP的访问,等等。但这是另一个主题。
1.始终使用pma的本地副本或另一个客户端(如MySQL Workbench)从外部访问数据库(假设您的主机允许这样做)。
最后
1.如果这两种方法都不适合您,您必须使用cPanel的pma,那么在每个会话结束时导出所有例程并重新创建它们(没有DEFINER语句)。目前pma在例程导出函数中不包含DROP(对此有一个更改请求)所以你必须使用数据库导出来包含它们。除非你无论如何都想要完整备份,您只需要导出一个表的结构即可进行此导出。请确保在导出定义中单击“包括DROP...”和“包括例程...”。编辑导出以删除表定义,并将“DEFINER=
cpses_db...@localhost
“全局替换为“”然后在下一个会话中使用它重新创建例程。希望能有所帮助。
zazmityj2#
听起来你没有权限编辑它,或者你试图从错误的数据库(模式)编辑它。运行下面的命令来查看它在哪个数据库上:显示函数状态,如“%daily %”;显示过程状态,如“%daily %”;
您是想通过执行语句还是使用GUI来编辑它?如果是通过执行语句,您能提供您的语句吗?如果是通过语句,请确保您已经先运行了以下代码:请在此处使用db_name_;
然后尝试再次编辑您的例程。
该过程是由您的用户创建的,还是由其他用户创建的?您可能没有修改用户过程的权限。可以通过运行以下命令查看创建者:显示创建过程daily_difference;
然后通过运行以下语句查看您是否具有编辑过程的权限-您需要“ALTER ROUTINE”权限:在此处显示您的用户名的授权;
如果是由具有超级权限的用户创建的,则您将无法编辑它-您需要他们来编辑,或者您需要获得超级权限。
quhf5bfb3#
我回复部分是因为我有一个工作,部分是为了喜剧,因为GoDaddy给我发了这个页面,作为这个问题的解决方案,是的,这个问题是明确的,但没有,没有解决方案。
我不得不在phpMyadmin中重建我的SP,但对于存在root@localhost的DEFINER,使用我创建的帐户,并可以使用- account@localhost。cPanel不公开root帐户AFAIK。
我在其他地方没有我所有的SP定义。但是我发现在cPanel \ files \ backup \MySQL数据库中的文件有SP定义。这可能不在您的托管包中。从phpMyAdmin备份没有帮助,因为我仍然缺乏使用定义进行备份的权限。