在我的PHP代码中,我尝试了该指令的各种迭代:
$dbc->exec("CREATE DATABASE $dbName;
CREATE USER '$user'@'%' IDENTIFIED BY '$pass';
GRANT ALL ON $dbName.* to '$user'@'%' IDENTIFIED BY '$pass';
FLUSH PRIVILEGES;")
而且,通过迭代,我的意思是调整数据库特权值:
对于所有尝试,我最终遇到一个使用GRANT USAGE语句创建并且与目标数据库($ dbName)无绑定(关联)的用户。
我唯一一次成功实现此目标的方法就是将特权级别更改为*。*,这将为该用户授予所有数据库的所有权限,而我试图避免这种情况。我只想将授予限制为命名数据库。相反,当我执行一次GRANT ALL或GRANT ALL PRIVILEGES时,每次都会得到以下结果:
MariaDB [(none)]> show grants for someAdmin@localhost;
+-------------------------------------------------------------------------------+
| Grants for someAdmin@localhost
+-------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'someAdmin'@'localhost' IDENTIFIED BY PASSWORD '[snip]' |
+-------------------------------------------------------------------------------+
1 row in set (0.00 sec)
在发出命令后,我也尝试过重新启动mariadb,只是为了查看重新启动是否会强制正确的privs而不会。
什么是向新用户授予数据库上所有特权(带有Grant选项)的正确SQL。授予用户实际上在命名数据库上的所有特权?
(PHP 7.2,MariaDB 10.1,Ubuntu 18.04)
来自MariaDB文档:
全局特权使用*。*授予priv_level。全球 特权包括管理数据库和管理的特权 用户帐户,以及所有表,函数和 程序。全局特权存储在mysql.user表中。
使用db_name。*授予priv_level的数据库特权,或者 仅使用*使用默认数据库。数据库特权包括 创建表和函数的权限,以及 数据库中的所有表,函数和过程。数据库 特权存储在mysql.db表中。
答案 0 :(得分:0)
'$user'@'%'
'someAdmin'@'localhost'
'%'
不包含'localhost'
,而是包含其他所有内容。
正常模式是
CREATE USER 'user'@'...' IDENTIFIED BY '...';
GRANT ALL ON 'db'.* TO 'user'@'...';
^^^^^^^^^^^^
These must match exactly.
(过去,GRANT
会CREATE
用户;在将来(MySQL 8.0)它将不会。MariaDB最终可能会朝这个方向发展。)
对于ON 'db'.*
,dbname是可选引用的。 (如果未引用,请提防某些标点符号。)*
是通配符,表示“所有数据库”。
我认为此上下文允许使用双引号,单引号或反斜杠进行报价。
答案 1 :(得分:0)
此查询组合对我有用:
$dbc->exec("CREATE DATABASE $dbName;
CREATE USER '$user'@'$host' IDENTIFIED BY '$pass';
GRANT ALL PRIVILEGES ON $dbName.* to '$user'@'$host' IDENTIFIED BY '$pass';
FLUSH PRIVILEGES;")
用户具有通配符:{$ dbname} 权限绑定到新创建的数据库。深入挖掘,我看到用户具有所有能力,包括在新数据库中创建索引和db对象的能力,但格兰特除外,这是我真正需要的。在全球范围内,新用户仍然具有“使用”级别的权限,这也是可取的。
感谢您的问题和帮助-我开始尝试各种不同的事情!