我有一个问题,当我尝试通过我的Web应用程序执行存储过程时,我显示以下错误
SQLSTATE[42000]: Syntax error or access violation: 1142 INSERT command denied to user 'elitecareers_admin'@'%' for table 'user'
为了清楚起见,这是我的存储过程
DELIMITER $$
CREATE PROCEDURE `sp_create_account`( username_param VARCHAR(40), email_param VARCHAR(60), pass_w VARCHAR(30), category_id TINYINT )
BEGIN
DECLARE salt VARCHAR(60);
DECLARE password_var VARCHAR(128);
SET salt = 'ELiCrs@4$^7EC%?';
SET salt = CONCAT( username_param, salt );
SET password_var = SHA2( CONCAT( pass_w, salt ), 0 );
INSERT INTO elite.user
( user_id, username, email, pass, active, date_joined, user_category_id )
VALUES
( DEFAULT, username_param, email_param, password_var, DEFAULT, DEFAULT, category_id );
END $$
DELIMITER ;
以下是用户'elitecareers_admin' @'%' Web应用程序正在执行的位置
如果用户拥有数据库的所有权限,我不明白为什么mysql / maria服务器会保留这些错误?
答案 0 :(得分:0)
“SQL SECURITY特性可以是DEFINER或INVOKER来指定安全上下文;也就是说,例程是使用例程DEFINER子句中指定的帐户的权限还是调用它的用户执行。此帐户必须具有权限访问与例程关联的数据库。默认值为DEFINER。调用例程的用户必须具有EXECUTE特权,如果例程在definer安全性中执行,则必须具有DEFINER帐户上下文。“ - https://dev.mysql.com/doc/refman/5.7/en/create-procedure.html
因此,无论谁运行proc,'elitecareers_admin'@'%'
的权限都将用于访问表elite
。user
等内容。但该用户似乎只拥有数据库elitecareers\_elite
的权限。
计划A:如果适当,请使用SQL SECURITY INVOKER
重新创建过程。
计划B:找出数据库elite
和elitecareers\_elite
之间的差异。
计划C:添加另一个GRANT
,让该管理员转到elite
。
计划D :(可能还有其他解决方案。)