我有一个Yii2项目,它操作一些数据库集。它有一个基本的数据库连接,我在其中保存用户的身份验证数据,第二个连接指向为每个用户自动创建的数据库。
我必须以编程方式创建数据库;因此,我有一个用户project
,它在project'_%
.*上具有全局授予权限和通配符权限。这就是我所做的:
$queries = [
"CREATE DATABASE ".$dbname,
"FLUSH PRIVILEGES",
"CREATE USER '{$dbuser}'@'localhost' IDENTIFIED BY '{$dbpass}'",
"GRANT ALL PRIVILEGES ON {$dbname}.* TO '{$dbuser}'@'localhost'"
];
foreach($queries as $q) $application->db->createCommand($q)->execute();
$dbname is 'project_'.randomString(8).
我仔细检查了所有的project
权限,检查了mysql
。user
和information_scheme
也是,我有可授予的权限和授予选项,但仍然收到访问错误:
SQLSTATE[42000]:语法错误或访问冲突:1044拒绝用户"project"@"localhost"访问数据库"project_sck6jdyb"正在执行的SQL是:授予project_sck6jdyb.*"pu_sck6jdyb"@'localhost'的所有特权。
MySQL version is 5.6.21
,在XAMPP
、Windows下运行。这是个错误,还是我做错了什么?
更新:SHOW GRANTS for project@localhost;
GRANT INSERT、CREATE、DROP、RELOAD、INDEX、ALTER、SUPER、CREATE USER ON
*.*
TO'project'@'localhost'IDENTIFIED BY PASSWORD'*[secret]'WITH GRANT OPTION授予
project
的所有特权。*授予"项目"@"本地主机"授予
project'_%
上的所有特权。*授予"项目"@"本地主机"和授予选项
要授予权限,您必须具有grant_OPTION权限,而且还必须具有要授予的权限。在您的职位上,您拥有以下特权:INSERT, CREATE, DROP, RELOAD, INDEX, ALTER, SUPER, CREATE USER
。
尝试只授予您所拥有的特权。我希望这会奏效。