将DROP USER和DROP DATABASE与SELECT .. WHERE查询结合使用?

3
我想做一件非常简单的事情,复制mysql的交互式mysql_secure_installation脚本的功能。我的问题是,在MySQL中是否有一种简单的内置方法可以将SELECT查询的输出与DROP USER或DROP数据库脚本的输入组合起来?
例如,如果我想删除所有空密码的用户。如何使用DROP USER语句实现?我知道一个明显的解决方案是从Python脚本运行所有内容,
  1. 运行带有mysql -Bse“select…”的查询
  2. 使用某些程序解析输出
  3. 构造删除查询
  4. 运行它。
在一个简单的SQL查询中是否有简单的方法来做到这一点?我在这里看到了一些例子,但我不会称之为简单:https://dev59.com/L3RB5IYBdhLWcg3wiHll#12097567 你会建议制作一个组合查询,还是只使用Python或bash脚本/sed解析输出?
2个回答

4
您可以动态构建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

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://dev59.com/1X3aa4cB1Zd3GeqPb1ZS#47902078


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接