[英]create database in mySQL doesn't seem to be working correctly
我想让Java为我创建一个数据库和一个用户。 我正在使用Netbeans,以便可以看到存在哪些数据库。 创建数据库时,我可以在Netbeans-> Services-> Databases中看到该数据库存在。
该程序最初检查数据库是否已经存在,以便我可以多次运行它。 使我感到惊讶的是,当我第二次运行它时,它不知道该数据库已经存在,因此它想重新创建该数据库。 如果Netbeans看到了,为什么我的Java程序看不到? (我在Grant语句中发现了我的错误,因此我将其纠正为正确。)
我有删除数据库和用户的例程。 如果我删除数据库,在这里也将消失在Netbeans-> Services-> Databases中。
用户的处境没有问题。 如果删除用户,然后创建数据库,它将识别该用户不存在,然后创建该用户。 如果仅删除数据库,它将识别出该用户已经存在。
我将为放置数据库和用户提供一些代码片段:
String sql = "drop user '" + user + "'@'%'";
try {
stm1 = con1.createStatement();
executeStatement(stm1, sql);
stm1.close();
con1.close();
} catch (Exception e) { System.out.println(e.getMessage());}
String sql = "drop database " + dbName;
try {
stm1 = con1.createStatement();
executeStatement(stm1, sql);
stm1.close();
con1.close();
} catch (Exception e) { System.out.println(e.getMessage());}
可以看出,这里没有什么特别的事情。 在创建数据库中,我认为问题可能源于我现阶段未创建任何表的事实。 (已编辑以删除添加的表。)
好的,在此阶段数据库没有表。 我需要第二次访问,现在我希望能够与对数据库具有特权的用户连接到我刚创建的数据库。 我得到的错误是
Access denied for user 'myuser'@'%' to database 'mytst1'
我刚刚创建了mytst1,然后在Netbeans-> Services-> Databases下看到它。 目前没有表格。 再次错误是在Grant语句中。
这是创建数据库的例程:
void createDB() {
Connection con1 = connect2database(false, false);
if( con1 != null) {
JOptionPane.showMessageDialog(this, "The database already exists.\n"
+ "Maybe you only need to create the tables?");
return;
}
con1 = connect2database(false, true);
if( con1 == null) {
JOptionPane.showMessageDialog(this, "Can't connect to mySQL server.\n"
+ "Is the path to the database correct, including IP (with :3306)\n"
+ "The database name itself (the last part) is ignored, but the path is used.\n"
+ "Is the root password correct?");
return;
}
String tmp, user = jTextUser.getText();
String host, pwTmp;
String userPw = jTextPW.getText();
String sql = "create database if not exists " + dbName;
boolean OK1, itExists;
Statement stm1, stm2;
ResultSet rSet;
try {
stm1 = con1.createStatement();
OK1 = executeStatement(stm1, sql);
if( !OK1) {
JOptionPane.showMessageDialog(this, "Create database failed.");
return;
}
sql = "select host, user from mysql.user where user = '" + user + "'";
rSet = stm1.executeQuery(sql);
itExists = false;
while(rSet.next()) {
itExists = true;
host = rSet.getString(1);
tmp = rSet.getString(2);
}
if(!itExists) {
sql = "create user '" + user + "'@'%' identified by '" + userPw + "'";
OK1 = executeStatement(stm1, sql);
if( !OK1) {
JOptionPane.showMessageDialog(this, "Create user failed.");
return;
}
}
sql = "grant all privileges on " + dbName + ".* to '" + user + "'@'%' identified ";
sql += "by '" + userPw + "' with grant option";
executeStatement(stm1, sql);
sql = "flush privileges";
executeStatement(stm1, sql);
stm1.close();
con1.close();
} catch (Exception e) { System.out.println(e.getMessage()); }
}
我希望发生的事情是它将在例程的顶部退出,表明数据库已经存在。 如果我要求使用已经使用了很长时间的数据库来存储数据,它确实会在此时退出。 旧数据库显然有很多表。
我的错误是执行“授予mytst1上的所有特权”而不是“授予mytst1。*上的所有特权”,即mytst1中的所有表。
谢谢,伊兰
创建用户或架构时,用户和架构并不相同,但是您必须添加用户权限才能对架构进行操作,并且一旦删除其中任何一个,它们就会丢失。 创建单独的语句以授予特权时,请确保该用户存在。 一旦连接用户, FLUSH
语句将从mysql
模式重新加载privs使其生效。 如果该模式中没有记录,则效率较低。 如果您想访问数据库元数据,尤其是在开发阶段,也需要向用户授予mysql
模式的权限。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.