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

2021-11-20 00:00:00 mysql phpmyadmin

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

I imported a MySQL database. All the tables where successfully imported but not the functions. The only way I can execute SQL queries is through phpMyAdmin or with a PHP script (no SSH).

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

Here's an example of the functions to import:

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 - 访问被拒绝;您需要此操作的 SUPER 权限

If I paste this code in phpMyAdmin I get this error: #1227 - Access denied; you need the SUPER privilege for this operation

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

I tried removing the "/!50003" and the "/" to uncomment the SQL but I get the same error message.

我也尝试不使用任何分隔符并删除DELIMITER ;;"并收到此错误:

I also tried not using any delimitors and removing "DELIMITER ;;" and got this error:

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的问题还是服务器的问题?

Is the problem in the SQL, phpMyAdmin or with the server?

推荐答案

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

The problem was I didn't have the super privilege but if I remove the DEFINER from the query I don't need this privilege anymore.

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

As of MySQL 5.0.3, CREATE PROCEDURE and CREATE FUNCTION require the CREATE ROUTINE privilege. They might also require the SUPER privilege, depending on the DEFINER value, as described later in this section. If binary logging is enabled, CREATE FUNCTION might require the SUPER privilege, as described in Section 18.6, "Binary Logging of Stored Programs".

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

Also had to set the delimiter field under the SQL text box.

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

Here's the SQL Query without the DEFINER statement:

/*!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 */;;

相关文章