这就是我如何通过Linux在MySQL中创建一个经过身份验证的所有特权用户及其数据库的方法:
cat <<-DBSTACK | mysql -u root -p"${dbrootp}"
CREATE (OR RE-CREATE IF NEEDED) USER "${domain}"@"localhost" IDENTIFIED BY "${dbuserp}";
CREATE (OR RE-CREATE IF NEEDED) DATABASE ${domain};
GRANT ALL PRIVILEGES ON ${domain}.* TO "${domain}"@"localhost";
DBSTACK有没有一些高级语法或高级功能可以在一行中完成所有这些工作?
(要比运行5行代码更好--2行用于此处文档的开头符和分隔符,3行用于MySQL)。
发布于 2018-02-15 22:28:52
每个MySQL文档都没有组合语法,大概是因为CREATE USER和CREATE DATABASE通常执行一次,而GRANT执行多次。
减少语法开销的一种方法是将SQL结构封装在shell函数中。对于bash,这可能看起来像这样:
grant_sql() {
local user pass
user="${1:?Missing argument #1: MySQL user name}"
pass="${2:?Missing argument #2: password for MySQL user}"
cat <<EOSQL
CREATE USER "${user}"@"localhost" IDENTIFIED BY "${pass}";
CREATE DATABASE ${user};
GRANT ALL PRIVILEGES ON ${user}.* TO "${user}"@"localhost";
EOSQL
}然后启动它,如下所示:
grant_sql "myUser" "itsPassword" | mysql -uroot -p...发布于 2018-02-15 22:16:58
据我所知,没有任何内置命令可以将所有这些任务集于一身,但您可以轻松地定义自己的stored program来执行:
CREATE PROCEDURE addNewDomain(domain VARCHAR(32), password VARCHAR(32))
BEGIN
DECLARE db VARCHAR(66) DEFAULT CONCAT('`', REPLACE(domain, '`', '``'), '`');
DECLARE ac VARCHAR(76) DEFAULT CONCAT(db, '@localhost');
SET
@a := CONCAT('CREATE USER ', ac, ' IDENTIFIED BY ', QUOTE(password)),
@b := CONCAT('CREATE DATABASE ', db),
@c := CONCAT('GRANT ALL PRIVILEGES ON ', db, '.* TO ', ac)
;
PREPARE stmt FROM @a; EXECUTE stmt; DEALLOCATE PREPARE stmt;
PREPARE stmt FROM @b; EXECUTE stmt; DEALLOCATE PREPARE stmt;
PREPARE stmt FROM @c; EXECUTE stmt; DEALLOCATE PREPARE stmt;
END然后您可以用一条CALL语句调用它:
CALL addNewDomain('foobar', 's3cr3t')这种方法的一个优点是,该过程可以由具有完全CREATE和GRANT权限的用户定义,但将EXECUTE它的权限授予没有这些权限的用户-然后您的shell脚本可以使用较低权限的帐户连接到MySQL (这可以造成较小的损害,例如,如果受到危害,只设置新域)。
请注意,为了发出CREATE PROCEDURE命令(其中包含;字符),您需要确保MySQL客户端的语句分隔符设置为;以外的值,否则在发送到服务器时,它会将命令拆分为多个单独的语句。MySQL命令行界面使用DELIMITER语句执行此操作:
DELIMITER ;;
CREATE PROCEDURE addNewDomain(domain VARCHAR(32), password VARCHAR(32))
BEGIN
-- etc
END;;
DELIMITER ;https://stackoverflow.com/questions/48617230
复制相似问题