You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法在Azure Database for MySQL中创建存储过程的问题求助

Azure Database for MySQL存储过程创建权限问题解决方案

你遇到的这个权限问题在Azure托管MySQL里很常见,我来帮你逐一解答你的疑问:

首先明确你的问题背景:你已经配置好Azure Database for MySQL,能正常连接、创建表和执行查询,但创建存储过程时触发了以下错误:

Er 1227. Access error Code: denied; you need (at least one of) the SUPER privilege(s) for this operation

你尝试的示例存储过程代码如下:

DELIMITER $$ 
CREATE DEFINER='user'@'server' PROCEDURE `sp_getComplaintsByBranchCode`( 
    in branchCode Varchar(50), 
    in companyCode Varchar(50), 
    in RowsPerPage INT, 
    in pageNumber INT 
) 
NOT DETERMINISTIC NO SQL SQL SECURITY DEFINER 
BEGIN 
    DECLARE pageFrom INT; 
    DECLARE rowLimit INT; 
    DECLARE companyid varchar(50); 
    DECLARE branchid varchar(50); 
    DECLARE offval INT; 
    SET pageFrom = pageNumber; 
    SET rowLimit = RowsPerPage; 
    SET branchid = branchCode; 
    SET companyid = companyCode; 
    SET offval = ((pageFrom-1) * rowLimit); 
    select * from complaints c WHERE c.branchCode = branchid AND c.fb_companyID = companyid ORDER BY added_on DESC limit rowLimit OFFSET offval; 
END $$
DELIMITER ;

你提到初始创建的数据库管理员用户没有SUPER权限,只有azure_superuser拥有该权限但你没有连接密码,下面针对你的三个问题给出具体方案:

1. 如何连接到'azure_superuser'?

很抱歉,azure_superuser是Azure托管MySQL的内置系统账号,微软并未开放给用户直接连接的权限。这个账号仅用于Azure平台内部管理数据库实例,普通用户无法获取它的密码,也没办法登录使用。

2. 无需登录root用户,如何为现有管理员用户授予超级用户权限?

在Azure Database for MySQL中,用户自己创建的管理员账号无法被授予SUPER权限——这是托管服务的安全限制,SUPER权限仅由azure_superuser持有。不过,如果你需要完成某些依赖SUPER权限的操作,可以通过Azure门户或Azure CLI调整对应的服务器参数来绕过限制,比如修改log_bin_trust_function_creators参数,允许非超级用户创建函数。

3. 如何让super_priviledge为'N'的用户在Azure Database for MySQL中创建存储过程?

问题的核心在于你存储过程定义里的DEFINER子句和SQL SECURITY DEFINER设置!默认情况下,使用DEFINER指定其他用户或者设置SQL SECURITY DEFINER会要求创建者拥有SUPER权限,我们可以通过修改存储过程定义来避开这个要求:

  • 移除DEFINER='user'@'server'子句,让存储过程默认使用当前创建它的用户作为DEFINER
  • 将SQL SECURITY DEFINER改为SQL SECURITY INVOKER,这样存储过程会以调用它的用户权限执行,无需SUPER权限

修改后的存储过程代码如下:

DELIMITER $$ 
CREATE PROCEDURE `sp_getComplaintsByBranchCode`( 
    in branchCode Varchar(50), 
    in companyCode Varchar(50), 
    in RowsPerPage INT, 
    in pageNumber INT 
) 
NOT DETERMINISTIC NO SQL SQL SECURITY INVOKER 
BEGIN 
    DECLARE pageFrom INT; 
    DECLARE rowLimit INT; 
    DECLARE companyid varchar(50); 
    DECLARE branchid varchar(50); 
    DECLARE offval INT; 
    SET pageFrom = pageNumber; 
    SET rowLimit = RowsPerPage; 
    SET branchid = branchCode; 
    SET companyid = companyCode; 
    SET offval = ((pageFrom-1) * rowLimit); 
    select * from complaints c WHERE c.branchCode = branchid AND c.fb_companyID = companyid ORDER BY added_on DESC limit rowLimit OFFSET offval; 
END $$
DELIMITER ;

另外补充一点:如果你的后续操作涉及创建自定义函数,可能需要在Azure门户的服务器参数中把log_bin_trust_function_creators设置为ON,这个参数可以允许无SUPER权限的用户创建非确定性函数,但你的当前存储过程不需要这个设置。

内容的提问来源于stack exchange,提问作者mohit mathur

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:36:02