该问题通常有以下两种情况:
情况一:mysql.user表中没有该user和host组合
1、登录root账号查看user表
情况二:初步授权过大,无法revoke修改数据库权限
在处理用户授权问题时,假定数据库名为cs18,我们首先使用如下命令赋予用户对整个数据库的全部权限:
GRANT ALL PRIVILEGES ON cs18.* TO 'user'@'host';
这意味着用户’user’可以从指定的主机’host’访问数据库cs18下的所有表和视图。
然而,在完成全局授权之后,若需撤消该用户对数据库内特定表(比如表b)的权限,执行如下REVOKE语句:
REVOKE ALL PRIVILEGES ON cs18.b FROM 'username'@'host';
执行该撤销操作时遇到错误提示:“error 1141(4200): There is no such grant defined for user ‘xxx’ on host ‘xxx’”,
原因在于:在MySQL中,为了正确撤销指定表的权限,必须首先确保该用户对该数据库至少具备一定的权限。这是因为MySQL遵循“先授予权限,后撤销特定权限”的逻辑。只有在用户已获得数据库表的某一层次权限后,才能对其进一步精细化管理,包括撤销特定表的权限。
针对表数量众多的情况,手动逐个操作显然效率低下。为此,可以考虑采用自动化脚本来批量进行权限管理。
#!/bin/bash
# 脚本配置
USER='yw4'
HOST='%'
DATABASE='cs18'
ROOT_USER='root'
ROOT_PASSWORD='Infra5@Gep0int'
# 构建查询语句,获取表名
query="SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '$DATABASE'"
# 执行查询并将结果存储在数组中
readarray -t TABLES < <(mysql -u"$ROOT_USER" -p"$ROOT_PASSWORD" -Bse "$query")
# 遍历数组中的表名并赋予权限
for TABLE in "${TABLES[@]}"; do
echo "为 $DATABASE.$TABLE 上的 $USER@$HOST 授予权限中..."
mysql -u"$ROOT_USER" -p"$ROOT_PASSWORD" -e "GRANT ALL PRIVILEGES ON $DATABASE.$TABLE TO '$USER'@'$HOST';"
done
echo "权限授予成功"