MySQL/MariaDB:'GRANT ... IDENTIFIED BY' 与 'CREATE USER' 和 'GRANT' 有什么区别?

MySQL/MariaDB: What is the difference between 'GRANT ... IDENTIFIED BY' vs 'CREATE USER' and then 'GRANT'?

设置数据库时,我通常会创建一个用户:

CREATE USER myuser@localhost IDENTIFIED BY 'pa$$w0rd';

然后给用户一些数据库权限:

GRANT SELECT, INSERT, UPDATE ON dbname.* TO 'myuser'@'localhost' IDENTIFIED BY 'pa$$w0rd';

我到处都看到这两个命令序列是执行此操作的方法。但是,我注意到如果我跳过 CREATE USER 命令并从 GRANT 开始,用户似乎是自动创建的并且工作正常。 在 GRANT 之前仍应使用 CREATE USER 是否有原因?或者它只是一个旧的约定,可能是为了向后兼容?

您正在做的事情在 MySQL 8.0 中不起作用。在 GRANT 命令中自动创建用户的功能已被删除,您必须先使用 CREATE USER

MySQL 用于仅通过向用户授予权限来支持隐式创建用户。这种用法允许 GRANT 是幂等的,并且 replication-safe。例如,当用户可能存在也可能不存在于副本上时,如果用户不存在,则 GRANT 将创建该用户。如果用户确实存在,那么 GRANT 仍然有效,并在需要时添加权限。

以这种方式使用 GRANT 时,可以选择使用 IDENTIFIED BY 子句来设置密码。如果用户已存在,则不需要 IDENTIFIED BY,因为用户已有密码。如果用户不存在,则省略 IDENTIFIED BY 将隐式创建用户,但没有密码(即任何人都可以作为该用户登录而无需输入密码)。

这被认为是一种安全风险。例如,如果有人使用 GRANT 而没有 IDENTIFIED BY,并且在用户名上出现拼写错误,那么可能会意外地创建一个具有权限但没有密码的新用户。

GRANT ALL ON *.* TO 'ruhnett'@'%';  -- misspelled username creates new user

这将允许任何人以新用户身份登录并获得特权访问。

因此在 MySQL 5.7 中,不推荐使用 GRANT 隐式创建用户。

CREATE USER ... IF NOT EXISTS 语法取代了幂等用户创建。这鼓励开发人员更明确地说明何时要创建用户以及何时要向现有用户授予权限。