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

3
我正在运行两个脚本。
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;

and

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
更新:IF EXISTS 和 IF NOT EXISTS 不适用于 USER。对于 DATABASE,它可以正常工作。

错误 1064(42000):您的 SQL 语法有误;请检查与您的 MySQL 服务器版本相对应的手册,以了解在第 1 行使用正确的语法,如“IF NOT EXISTS 'foo'@'localhost' IDENTIFIED BY 'bar'”。

错误 1064(42000):您的 SQL 语法有误;请检查与您的 MySQL 服务器版本相对应的手册,以了解在第 1 行使用正确的语法,如“IF EXISTS 'foo'@'%'”。

1个回答

3
您可以在数据库模式和用户创建中添加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以下版本中不要使用下面的create user语法,而是将grant语句改为:
GRANT ALL PRIVILEGES ON foobar.* TO 'foo'@'localhost' identified by 'password' WITH GRANT OPTION;

如果存在(IF EXISTS)和如果不存在(IF NOT EXISTS)对于用户(USER)会导致语法错误。 - undefined
错误 1064 (42000):您的SQL语法存在错误;请检查与您的MySQL服务器版本相对应的手册,以获得正确的语法使用方式,靠近'IF NOT EXISTS 'foo'@'localhost' IDENTIFIED BY 'bar'' 在第1行。 - undefined
错误 1064 (42000):您的SQL语法有误;请参考与您的MySQL服务器版本相对应的手册,以查找正确的语法在 'IF EXISTS 'foo'@'%' 的附近使用。第 1 行。 - undefined
尝试使用WHERE EXISTS http://dev.mysql.com/doc/refman/5.7/en/exists-and-not-exists-subqueries.html - undefined
IF EXISTS在5.7版本中被添加。 http://dev.mysql.com/doc/refman/5.6/en/drop-user.html DROP USER user [, user] ... http://dev.mysql.com/doc/refman/5.7/en/drop-user.html DROP USER [IF EXISTS] user [, user] ... 但问题是关于5.5版本的。 - undefined

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