SQL
✅ 正确 SQL 示例(直接用于 SQL 执行):
如果你是在 MySQL 命令行中执行,变量需要先替换,比如:
sqlCopyEdit
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 或直接拼接变量:
bashCopyEdit
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:
bashCopyEdit
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 变量,必须在脚本执行时已经设置。建议只授予某个库权限,例如:
sqlCopyEdit
GRANT ALL PRIVILEGES ON halo.* TO '${USERNAME}'@'%';
不要授予 *.* 除非你信任该用户并用于开发。
如你希望我直接帮你生成一个完整的用户创建 + Halo 配置脚本,我可以整合给你。是否需要?
You said:
该用户是否有权限新建数据库?
ChatGPT said:
是的,如果你执行的是下面这条授权语句:
sqlCopyEdit
GRANT ALL PRIVILEGES ON *.* TO '${USERNAME}'@'%';
那么该用户 有以下权限:
对所有数据库的所有表 (
*.*) 拥有所有权限(包括CREATE,DROP,SELECT,INSERT,UPDATE,DELETE,ALTER等)可以创建数据库(具备
CREATE和CREATE DATABASE权限)可以删除数据库(具备
DROP权限)也可以创建新用户、修改权限(如果再加上
WITH GRANT OPTION)
如果你只希望该用户访问某个库(如 halo),并希望它只不能建库删库,则应使用:
sqlCopyEdit
GRANT ALL PRIVILEGES ON halo.* TO '${USERNAME}'@'%';
这种情况下:
✅ 可以访问、操作
halo库中的所有表❌ 没有创建/删除数据库的权限
❌ 不能查看其他库内容
权限说明补充:
你可以通过以下命令查看用户权限:
sqlCopyEdit
SHOW GRANTS FOR 'halo_user'@'%';
如你在生产环境部署,不推荐授予 *.* 权限,建议精细授权。例如:
sqlCopyEdit
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, ALTER ON halo.* TO 'halo_user'@'%';
是否需要我帮你生成最小权限版本的 Halo 用户授权语句?