如何在MySQL中可靠地删除和创建数据库和用户

时间:2016-09-26 14:30:19

标签: mysql database ant

我目前正在运行两个脚本。

01_INIT_DATABASE.SQL

CREATE DATABASE foobar;
USE foobar;
CREATE USER 'foo'@'localhost' IDENTIFIED BY 'bar';
GRANT ALL PRIVILEGES ON foobar.* TO 'foo'@'localhost' WITH GRANT OPTION;
CREATE USER 'foo'@'%' IDENTIFIED BY 'bar';
GRANT ALL PRIVILEGES ON foobar.* TO 'foo'@'%' WITH GRANT OPTION;

01_DROP_DATABASE.SQL

USE foobar
DROP USER 'foo'@'localhost';
DROP USER 'foo'@'%';
DROP DATABASE IF EXISTS foobar;

如果一方或另一方运行不正常,它们都会选择性地失败。

如何让它们可靠地运行(或优雅地失败,例如,只有在用户存在时才将其删除)

我正在通过一个ant任务运行它们(如果这会影响事情,但它实际上只是一个Java Exec),其形式为

<exec executable="mysql" input="./src/main/ddl/create/01_init_database.sql">
  <arg value="-uroot"/>
  <arg value="-ptoor"/>
</exec>

我的MySQL版本是

mysql  Ver 14.14 Distrib 5.5.52, for debian-linux-gnu (x86_64) using readline 6.2

更新 如果EXISTS和IF NOT EXISTS不适用于USER。它适用于DATABASE。

错误1064(42000):您的SQL语法有错误;查看与您的MySQL服务器版本相对应的手册,以便使用附近的语法,如果不是,则可以使用&#39; foo&#39; @&#39; localhost&#39;通过&#39; bar&#39;&#39;在第1行

错误1064(42000):您的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册,以便使用“#EVIS&#39; foo&#39; @&#39;%&#39;&#39;&#39;在第1行

1 个答案:

答案 0 :(得分:1)

您可以将IF NOT EXISTS添加到您的数据库管理和用户创建中:例如:

CREATE DATABASE IF NOT EXISTS foobar;
CREATE USER IF NOT EXISTS 'foo'@'localhost' IDENTIFIED BY 'bar';
GRANT ALL PRIVILEGES ON foobar.* TO 'foo'@'localhost' WITH GRANT OPTION;
CREATE USER  IF NOT EXISTS 'foo'@'%' IDENTIFIED BY 'bar';
GRANT ALL PRIVILEGES ON foobar.* TO 'foo'@'%' WITH GRANT OPTION;

和drop:

DROP USER IF EXISTS 'foo'@'localhost';
DROP USER IF EXISTS  'foo'@'%';
DROP DATABASE IF EXISTS foobar;

如下所述:用户(如果不存在)仅适用于mysql 5.7及更高版本。 不要使用5.7以下的创建用户语法,而是将grant语句更改为:

GRANT ALL PRIVILEGES ON foobar.* TO 'foo'@'localhost' identified by 'password' WITH GRANT OPTION;