首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在mysql中插入用户定义变量创建用户

问在mysql中插入用户定义变量创建用户
EN

Stack Overflow用户
提问于 2017-10-26 15:47:56
回答 2查看 960关注 0票数 0

我希望创建一个shell脚本,以便在docker中运行,并创建一个MySQL用户,其主机IP作为命令行变量传递。所以我的脚本是./create_user.sh 172.17.0.1

我试着从只在sql语句部分插入变量开始,并使用如下所示:

代码语言:javascript
复制
#!/bin/sh
docker exec -i atb-mariadb bash <<'EOF' 
mysql -uroot -pmypass
set @ip='172.17.0.1';
CREATE USER 'exporter'@@ip IDENTIFIED BY 'mypass';
GRANT PROCESS, REPLICATION CLIENT ON *.* TO 'exporter'@'172.17.0.1';
GRANT SELECT ON performance_schema.* TO 'exporter'@'172.17.0.1';
SELECT user, host FROM mysql.user;
exit
EOF

这会导致语法错误,还有一些我尝试过的语法错误:

代码语言:javascript
复制
CREATE USER CONCAT_WS('exporter','@',@ip) IDENTIFIED BY 'mypass';
CREATE USER 'exporter'@CONCAT_WS('',@ip) IDENTIFIED BY 'mypass';

当然,这只是脚本的sql语句部分中的变量。在整个shell脚本中使用一个变量并将其传递到sql是一个问题,我甚至还无法解决这个问题。

提前感谢您的帮助!

更新

我尝试了Raymond的解决方案,它适用于sql变量部分。但是,试图通过命令行传递变量值对于以下脚本仍然失败:

代码语言:javascript
复制
#!/bin/sh
echo script received $1
docker exec -e ipa=$1 -i atb-mariadb bash <<'EOF'
echo exec received $ipa
mysql -uroot -pmypass -e "
SET @ip='${ipa}';
SET @createUser = 'CONCAT("CREATE USER exporter@",@ip,"IDENTIFIED BY'mypass'")';
PREPARE smtpCreateUser FROM @createUser;
EXECUTE smtpCreateUser;";
exit
EOF

与输出

代码语言:javascript
复制
$ ./create_user.sh 172.18.0.5
script received 172.18.0.5
exec received 172.18.0.5
mysql  Ver 15.1 Distrib 10.2.9-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2
Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

Usage: mysql [OPTIONS] [database]

Default options are read from the following files in the given order:
/etc/my.cnf /etc/mysql/my.cnf ~/.my.cnf
The following groups are read: mysql client client-server client-mariadb
The following options may be given as the first argument:
--print-defaults        Print the program argument list and exit.
......and so on

我理解通常的方法是使用.sql句柄运行一个单独的-e脚本文件,但不幸的是,绑定这个文件到默认的mariadb容器或创建自定义映像都是不可能的。

EN

回答 2

Stack Overflow用户

发布于 2017-10-26 16:04:20

您应该能够生成带有CONCAT的动态SQL语句,准备并执行它们。

查询

代码语言:javascript
复制
SET @ip = '172.17.0.1';

SET @createUser = CONCAT(
            "CREATE USER exporter@",@ip, " IDENTIFIED BY 'mypass'" 
          );

PREPARE smtpCreateUser FROM @createUser;
EXECUTE smtpCreateUser;
票数 3
EN

Stack Overflow用户

发布于 2017-10-26 16:12:35

您需要从shell获取变量,然后才能在查询中使用它。我认为您正在寻找类似的东西(请确保删除EOF中的引号):

代码语言:javascript
复制
#!/bin/sh
docker exec -i atb-mariadb bash <<EOF
ip="${1:-127.0.0.1}"
echo mysql -uroot -pmypass
echo CREATE USER 'exporter'@'${ip}' IDENTIFIED BY 'mypass';
GRANT PROCESS, REPLICATION CLIENT ON *.* TO 'exporter'@'172.17.0.1';
GRANT SELECT ON performance_schema.* TO 'exporter'@'172.17.0.1';
SELECT user, host FROM mysql.user;
exit
EOF
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46958620

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档