✅ 正确 SQL 示例(直接用于 SQL 执行):

如果你是在 MySQL 命令行中执行,变量需要先替换,比如:

sql

CopyEdit

CREATE USER IF NOT EXISTS 'halo_user'@'%' IDENTIFIED WITH mysql_native_password BY 'strong_password'; GRANT ALL PRIVILEGES ON *.* TO 'halo_user'@'%'; FLUSH PRIVILEGES;


✅ 如果你在 shell 脚本中自动执行:

可以这样写,使用 envsubst 或直接拼接变量:

bash

CopyEdit

USERNAME="halo_user" YourPassword="strong_password" docker exec -i mysql-container-name mysql -uroot -pYourRootPassword <<EOF CREATE USER IF NOT EXISTS '${USERNAME}'@'%' IDENTIFIED WITH mysql_native_password BY '${YourPassword}'; GRANT ALL PRIVILEGES ON *.* TO '${USERNAME}'@'%'; FLUSH PRIVILEGES; EOF

或者为了避免变量展开错误,最好在这里不要用单引号包变量名,使用双引号包整个 EOF

bash

CopyEdit

docker exec -i mysql-container-name mysql -uroot -pYourRootPassword <<EOF CREATE USER IF NOT EXISTS '${USERNAME}'@'%' IDENTIFIED WITH mysql_native_password BY '${YourPassword}'; GRANT ALL PRIVILEGES ON *.* TO '${USERNAME}'@'%'; FLUSH PRIVILEGES; EOF


⚠️ 注意事项:

  • ${USERNAME}${YourPassword} 是 shell 变量,必须在脚本执行时已经设置。

  • 建议只授予某个库权限,例如:

sql

CopyEdit

GRANT ALL PRIVILEGES ON halo.* TO '${USERNAME}'@'%';

不要授予 *.* 除非你信任该用户并用于开发。


如你希望我直接帮你生成一个完整的用户创建 + Halo 配置脚本,我可以整合给你。是否需要?

You said:

该用户是否有权限新建数据库?

ChatGPT said:

是的,如果你执行的是下面这条授权语句:

sql

CopyEdit

GRANT ALL PRIVILEGES ON *.* TO '${USERNAME}'@'%';

那么该用户 有以下权限

  • 对所有数据库的所有表 (*.*) 拥有所有权限(包括 CREATE, DROP, SELECT, INSERT, UPDATE, DELETE, ALTER 等)

  • 可以创建数据库(具备 CREATECREATE DATABASE 权限)

  • 可以删除数据库(具备 DROP 权限)

  • 也可以创建新用户、修改权限(如果再加上 WITH GRANT OPTION


如果你只希望该用户访问某个库(如 halo),并希望它只不能建库删库,则应使用:

sql

CopyEdit

GRANT ALL PRIVILEGES ON halo.* TO '${USERNAME}'@'%';

这种情况下:

  • ✅ 可以访问、操作 halo 库中的所有表

  • ❌ 没有创建/删除数据库的权限

  • ❌ 不能查看其他库内容


权限说明补充:

你可以通过以下命令查看用户权限:

sql

CopyEdit

SHOW GRANTS FOR 'halo_user'@'%';


如你在生产环境部署,不推荐授予 *.* 权限,建议精细授权。例如:

sql

CopyEdit

GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, ALTER ON halo.* TO 'halo_user'@'%';

是否需要我帮你生成最小权限版本的 Halo 用户授权语句?