use*_*823 22 mysql privileges grant
我经常在许多MySQL教程中看到人们IDENTIFIED BY 'password'在用户创建期间使用命令并授予他权限.
例如:
CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON database.* TO 'username'@'localhost' IDENTIFIED BY 'password';
Run Code Online (Sandbox Code Playgroud)
我尝试使用GRANT没有IDENTIFIED BY,它的工作原理.
有人能解释一下为什么它会被使用两次吗?特定权限可以有其他密码吗?
Sys*_*dox 33
GRANT用于向用户添加权限.令人困惑的是,它还能够创建用户并更改其密码.不推荐使用此功能,不应使用此功能.
如果您使用GRANT,IDENTIFIED您可以更改用户的密码:
如果存在IDENTIFIED并且您具有全局授予权限(GRANT OPTION),则指定的任何密码都将成为该帐户的新密码,即使该帐户存在且已有密码也是如此.如果没有IDENTIFIED,帐户密码将保持不变.
从MySQL 5.7.2开始,如果该帐户已存在,则禁止使用IDENTIFIED WITH,因为它仅用于创建新帐户时使用.
此外,GRANT如果用户不存在,可以创建用户:
如果GRANT语句中指定的帐户不存在,则采取的操作取决于NO_AUTO_CREATE_USER SQL模式:
- 如果未启用NO_AUTO_CREATE_USER,GRANT将创建该帐户.除非您使用IDENTIFIED BY指定非空密码,否则这是非常不安全的.
- 如果启用了NO_AUTO_CREATE_USER,GRANT将失败并且不会创建帐户,除非您使用IDENTIFIED BY指定非空密码或使用IDENTIFIED WITH命名身份验证插件.
自MySQL 5.7.6起,不推荐使用GRANT来定义帐户身份验证特性.而是使用CREATE USER或ALTER USER建立或更改身份验证特征.此GRANT功能将在未来的MySQL版本中删除.
请参阅https://dev.mysql.com/doc/refman/5.7/en/grant.html
总之,用于CREATE创建用户,并用于GRANT添加权限:
CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON database.* TO 'username'@'localhost';
Run Code Online (Sandbox Code Playgroud)
因此,作为授予自己创建的用户,下面的行足以满足权限-
GRANT ALL PRIVILEGES ON database.* TO 'username'@'localhost' IDENTIFIED BY 'password';
Run Code Online (Sandbox Code Playgroud)
注意:“识别”代表您的密码,您要保存用于凭证验证的密码。
来自MySQL 5.7 文档说:
但是,MySQL 5.7 中不推荐使用 GRANT 创建帐户或定义非特权特征。相反,请使用 CREATE USER 或 ALTER USER 执行这些任务。
但我在MySQL 8.0 doc上找不到该通知或类似消息,我尝试了:
grant all privileges on dbname . * to newuser@localhost;
Run Code Online (Sandbox Code Playgroud)
它被返回:
错误:不允许您使用 GRANT 创建用户
并由以下标识:
grant all privileges on dbname . * to newuser@localhost identified by 'passw0rd';
Run Code Online (Sandbox Code Playgroud)
返回:
您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,了解在第 1 行“identified by 'passw0rd'”附近使用的正确语法
MySQL 8.0 文档说:
通常,数据库管理员首先使用 CREATE USER 创建帐户并定义其非特权特征,例如密码、是否使用安全连接以及对服务器资源的访问限制,然后使用 GRANT 定义其特权。ALTER USER 可用于更改现有帐户的非特权特征
如果您想创建用户并授予权限,请使用:
CREATE USER 'user'@'localhost' IDENTIFIED BY 'passw0rd';
GRANT ALL PRIVILEGES ON database.* TO 'user'@'localhost';
Run Code Online (Sandbox Code Playgroud)
如果想更新密码,请先使用 alter:
ALTER USER 'user'@'localhost' IDENTIFIED BY 'passw0rd';
GRANT ALL PRIVILEGES ON database.* TO 'user'@'localhost';
Run Code Online (Sandbox Code Playgroud)