我目前正在运行两个脚本。
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行
答案 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;