无法在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

