2

我想做一个非常简单的事情,复制mysql的交互式mysql_secure_installation脚本的功能。我的问题是 MySQL 中是否有一种简单的内置方法可以将 SELECT 查询的输出与 DROP 用户或 DROP 数据库脚本的输入结合起来?

例如,如果我想删除所有密码为空的用户。我怎么能用 DROP USER 语句做到这一点?我知道一个明显的解决方案是运行所有内容,例如从 Python 脚本,

  1. 运行查询mysql -Bse "select..."
  2. 用一些程序解析输出
  3. 构造 drop 查询
  4. 运行。

有没有一种简单的方法可以在简单的 SQL 查询中做到这一点?我在这里看到了一些例子,但我不会说它简单:https ://stackoverflow.com/a/12097567/518169

您会建议进行组合查询,还是仅使用 Python 或 bash 脚本/sed 解析输出?

4

2 回答 2

3

您可以动态构建 SQL,例如:

SELECT CONCAT('DROP USER ', GROUP_CONCAT(QUOTE(User), '@', QUOTE(Host)))
INTO   @sql
FROM   mysql.user
WHERE  PASSWORD = ''

然后从中准备一个声明:

PREPARE stmt FROM @sql

然后执行该语句:

EXECUTE stmt

最后,释放准备好的语句:

DEALLOCATE PREPARE stmt
于 2012-09-09T21:34:27.310 回答
0

我的解决方案是使用--skip-column-names标志并将SELECT CONCAT(..)查询的输出传送回另一个 mysql 会话:

echo 'select concat("DROP USER ",user,"@\"",host,"\";") from mysql.user where User = "alex"' \
| mysql -uroot --skip-column-names \
| mysql -uroot

来源https://stackoverflow.com/a/47902078/410939

于 2018-12-11T13:37:20.980 回答