在 phpMyAdmin 中创建函数 - 错误:拒绝访问您需要此操作的超级权限

Posted

技术标签:

【中文标题】在 phpMyAdmin 中创建函数 - 错误:拒绝访问您需要此操作的超级权限【英文标题】:Creating functions in phpMyAdmin - Error: access denied you need the super privilege for this operation 【发布时间】:2013-05-23 23:38:33 【问题描述】:

我导入了一个 mysql 数据库。成功导入的所有表,但不是函数。我可以执行 SQL 查询的唯一方法是通过 phpMyAdmin 或使用 PHP 脚本(无 SSH)。

以下是要导入的函数的示例:

DELIMITER ;;
/*!50003 DROP FUNCTION IF EXISTS `f_calc_gst` */;;
/*!50003 SET SESSION SQL_MODE=""*/;;
/*!50003 CREATE*/ /*!50020 DEFINER=`journal`@`%`*/ /*!50003 FUNCTION `f_calc_gst`(p_ht decimal(15,3), p_province varchar(2)) RETURNS varchar(255) CHARSET utf8
begin
  declare res varchar(255); 
  declare v_gst decimal(15,3);
  declare v_gst_formula varchar(255);

  select GST, GST_formula
  into v_gst, v_gst_formula
  from taxes_periods
  where NOW() between dt_debut and dt_fin
  and id_province = p_province;

  set v_gst_formula = replace(v_gst_formula, 'HT$', p_ht);
  set v_gst_formula = replace(v_gst_formula, 'GST%', v_gst);

  set res = concat('select round(', v_gst_formula, ',2) "gst"');
  return res;
end */;;

如果我将此代码粘贴到 phpMyAdmin 中,我会收到以下错误:#1227 - Access denied;您需要此操作的 SUPER 权限

我尝试删除“/!50003”和“/”以取消注释 SQL,但收到相同的错误消息。

我也尝试不使用任何分隔符并删除“DELIMITER ;;”并得到这个错误:

DROP FUNCTION IF EXISTS f_calc_gst SET SESSION SQL_MODE =  "" CREATE DEFINER =  `journal`@`%` FUNCTION  `f_calc_gst` (

p_ht DECIMAL( 15, 3 ) ,
p_province VARCHAR( 2 )
) RETURNS VARCHAR( 255 ) CHARSET utf8 BEGIN declare res VARCHAR( 255 ) ;

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SET SESSION SQL_MODE=""
CREATE DEFINER=`journal`@`%` FUNCTION `f_calc_gst`(p_ht ' at line 2

也试过了:

    CREATE DEFINER=`journal`@`%` FUNCTION `f_calc_gst`(p_ht decimal(15,3), p_province varchar(2)) RETURNS varchar(255) CHARSET utf8
begin
  declare res varchar(255); 
  declare v_gst decimal(15,3);
  declare v_gst_formula varchar(255);

  select GST, GST_formula
  into v_gst, v_gst_formula
  from taxes_periods
  where NOW() between dt_debut and dt_fin
  and id_province = p_province;

  set v_gst_formula = replace(v_gst_formula, 'HT$', p_ht);
  set v_gst_formula = replace(v_gst_formula, 'GST%', v_gst);

  set res = concat('select round(', v_gst_formula, ',2) "gst"');
  return res;
end//

导致:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 3 

问题出在 SQL、phpMyAdmin 还是服务器?

【问题讨论】:

Store procedures in phpMyAdmin的可能重复 谢谢。在查看这篇文章之前,我没有使用分隔符字段。我试过了,但我仍然有同样的错误:#1227 - 访问被拒绝;您需要此操作的 SUPER 权限 【参考方案1】:

问题是我没有超级权限,但如果我从查询中删除 DEFINER,我就不再需要这个权限了。

从 MySQL 5.0.3 开始,CREATE PROCEDURE 和 CREATE FUNCTION 需要 CREATE ROUTINE 特权。他们可能还需要超级特权, 取决于 DEFINER 值,如本节后面所述。如果 启用二进制日志记录,CREATE FUNCTION 可能需要 SUPER 特权,如第 18.6 节“存储的二进制日志记录”中所述 程序”。

还必须在 SQL 文本框下设置分隔符字段。

这是没有 DEFINER 语句的 SQL 查询:

/*!50003 DROP FUNCTION IF EXISTS `f_calc_gst` */;;
/*!50003 SET SESSION SQL_MODE=""*/;;
/*!50003 CREATE*/ /*!50003 FUNCTION `f_calc_gst`(p_ht decimal(15,3), p_province varchar(2)) RETURNS varchar(255) CHARSET utf8
begin
  declare res varchar(255); 
  declare v_gst decimal(15,3);
  declare v_gst_formula varchar(255);

  select GST, GST_formula
  into v_gst, v_gst_formula
  from taxes_periods
  where NOW() between dt_debut and dt_fin
  and id_province = p_province;

  set v_gst_formula = replace(v_gst_formula, 'HT$', p_ht);
  set v_gst_formula = replace(v_gst_formula, 'GST%', v_gst);

  set res = concat('select round(', v_gst_formula, ',2) "gst"');
  return res;
end */;;

【讨论】:

以上是关于在 phpMyAdmin 中创建函数 - 错误:拒绝访问您需要此操作的超级权限的主要内容,如果未能解决你的问题,请参考以下文章

在 phpMyAdmin 中创建存储过程时,“错误 #1313 RETURN 只允许在 FUNCTION 中”

无法在 phpmyadmin 中创建程序

在 mysql 中创建函数不起作用 - 错误 1064

在 phpmyadmin 中创建触发器

在 MySql/phpmyadmin 中创建存储过程

如何在 phpmyadmin 中创建触发器