首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于创建经过身份验证的所有特权用户及其数据库的MySQL sugar语法

问用于创建经过身份验证的所有特权用户及其数据库的MySQL sugar语法
EN

Stack Overflow用户
提问于 2018-02-05 14:54:59
回答 2查看 136关注 0票数 3

这就是我如何通过Linux在MySQL中创建一个经过身份验证的所有特权用户及其数据库的方法:

代码语言:javascript
复制
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)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-02-15 22:28:52

每个MySQL文档都没有组合语法,大概是因为CREATE USER和CREATE DATABASE通常执行一次,而GRANT执行多次。

减少语法开销的一种方法是将SQL结构封装在shell函数中。对于bash,这可能看起来像这样:

代码语言:javascript
复制
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
}

然后启动它,如下所示:

代码语言:javascript
复制
grant_sql "myUser" "itsPassword" | mysql -uroot -p...
票数 2
EN

Stack Overflow用户

发布于 2018-02-15 22:16:58

据我所知,没有任何内置命令可以将所有这些任务集于一身,但您可以轻松地定义自己的stored program来执行:

代码语言:javascript
复制
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语句调用它:

代码语言:javascript
复制
CALL addNewDomain('foobar', 's3cr3t')

这种方法的一个优点是,该过程可以由具有完全CREATE和GRANT权限的用户定义,但将EXECUTE它的权限授予没有这些权限的用户-然后您的shell脚本可以使用较低权限的帐户连接到MySQL (这可以造成较小的损害,例如,如果受到危害,只设置新域)。

请注意,为了发出CREATE PROCEDURE命令(其中包含;字符),您需要确保MySQL客户端的语句分隔符设置为;以外的值,否则在发送到服务器时,它会将命令拆分为多个单独的语句。MySQL命令行界面使用DELIMITER语句执行此操作:

代码语言:javascript
复制
DELIMITER ;;

CREATE PROCEDURE addNewDomain(domain VARCHAR(32), password VARCHAR(32))
BEGIN
  -- etc
END;;

DELIMITER ;
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48617230

复制
相关文章

相似问题

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