检查mysql用户是否存在

检查mysql用户是否存在,mysql,Mysql,如何检查用户是否存在 我正在做一个mysql数据库的安装程序,我需要检查一个用户是否退出,如果不是创建用户,如果是删除用户并再次创建它 这样我就可以放心地执行脚本了 谢谢。MySQL将用户数据存储在名为MySQL的数据库中名为user的表中(默认情况下)。如果存在具有指定用户名的用户,则以下查询将返回1,否则返回0 SELECT EXISTS(SELECT 1 FROM mysql.user WHERE user = 'username') 如果您要删除MySQL用户,那么实际上不需要首先检查

如何检查用户是否存在

我正在做一个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
    用于删除查询结果头

这将仅从用户表中删除用户,如果采用这种方法,还必须从mysql.columns\u priv、mysql.db、mysql.tables\u priv中删除用户。此外,在未来的mysql版本中,此表列表可能会更改。永远不要以这种方式删除用户。使用
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
都意味着用户存在“存在”比“计数”更有效。