检查mysql用户是否存在
如何检查用户是否存在 我正在做一个mysql数据库的安装程序,我需要检查一个用户是否退出,如果不是创建用户,如果是删除用户并再次创建它 这样我就可以放心地执行脚本了检查mysql用户是否存在,mysql,Mysql,如何检查用户是否存在 我正在做一个mysql数据库的安装程序,我需要检查一个用户是否退出,如果不是创建用户,如果是删除用户并再次创建它 这样我就可以放心地执行脚本了 谢谢。MySQL将用户数据存储在名为MySQL的数据库中名为user的表中(默认情况下)。如果存在具有指定用户名的用户,则以下查询将返回1,否则返回0 SELECT EXISTS(SELECT 1 FROM mysql.user WHERE user = 'username') 如果您要删除MySQL用户,那么实际上不需要首先检查
谢谢。MySQL将用户数据存储在名为
MySQL
的数据库中名为user
的表中(默认情况下)。如果存在具有指定用户名的用户,则以下查询将返回1
,否则返回0
SELECT EXISTS(SELECT 1 FROM mysql.user WHERE user = 'username')
如果您要删除MySQL用户,那么实际上不需要首先检查它是否存在。如果没有要删除的内容,MySQL不会抛出任何错误:
DELETE FROM mysql.user WHERE User = 'username';
MySQL缺少DROP USER IF EXISTS构造 一个很好的解决方法是在删除特权之前向用户授予无害的特权。这 如果用户不存在,将创建该用户,以便可以安全地删除该用户,如下所示:
GRANT USAGE ON *.* TO 'username'@'localhost';
DROP USER 'username'@'localhost';
FLUSH PRIVILEGES;
使用实际上意味着没有特权
来源:我就是这样做到的:
#!/usr/bin/env bash
set -o errexit
set -o nounset
# Create credentials file
echo -e "[client]\nuser=root\npassword=${MYSQL_ROOT_PASSWORD}" > ~/.my.cnf
# Create standard user and grant permissions
if ! echo "SELECT COUNT(*) FROM mysql.user WHERE user = 'myuser';" | mysql | grep 1 &> /dev/null; then
echo "Creating database user ..."
echo "CREATE USER 'myuser'@'localhost' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON mydatabase.* TO 'myuser'@'localhost';
FLUSH PRIVILEGES;" | mysql
else
echo "Database user already created. Continue ..."
fi
相应地更改
myuser
、mydatabase
和mypassword
。由于MySQL的较新版本允许此选项:
DROP USER IF EXISTS 'username'@'host';
MySQL 5.7已经包括,但对于较旧的版本,我使用percona toolkit,并将
DROP USER
部分反馈给MySQL:
pt show grants--drop--only=$username | grep'^drop USER'| mysql-v
如果存在多个用户名-主机名对,则会删除所有用户名-主机名对。当需要检查某个用户是否存在而不删除该用户时(例如,在任何情况下跳过某些指令而不是执行它们时),可以使用此选项(其中,
$user
是要检查的用户):
if[$(echo“SELECT COUNT(*)FROM mysql.user WHERE user='$user'| mysql | tail-n1)-gt 0]
然后
回显“用户存在”
其他的
回显“用户不存在”
fi
注意:
命令需要额外的参数和/或身份验证配置)mysql
用于删除查询结果头tail-n1
DROP USER
命令。如果我们需要检查用户是否存在,以便提示是否应删除该用户,该怎么办?对于后代来说,此解决方法不再有效。引用另一个答案的评论:“这不再是一个选项。:(当前版本的MySQL不再为GRANT语句创建新用户。这是他们添加的一个“功能”。)”原始参考,请参阅:如果用户名包含数字1,则此操作不起作用。所以这可能会造成陷阱。@Joachim刚刚用一个用户名为1的用户测试了它,它工作得非常好。你确定吗?为什么它不适合使用1的用户?为什么grep1
?如果选择COUNT(*)
返回2
?@Fr0zenFyr如果使用mysql;描述用户
您会注意到:User | char(32)| PRI
。因为user
是主键,所以它意味着它是唯一的。这意味着一个完全匹配的=
不可能返回超过1。它实际上是一个复合键<代码>用户列本身不是PRI
。如果仔细观察,您将看到主键是主机
+用户
的组合Host char(60)NO PRI
和User char(32)NO PRI
为什么不从mysql.User中选择count(*),其中User='username'。任何>1
都意味着用户存在“存在”比“计数”更有效。