2013-11-03 41 views
0

我想让Java为我创建一个数据库和一个用户。我正在使用Netbeans,以便我可以查看存在哪些数据库。当我创建数据库时,我可以在Netbeans - >服务 - >数据库中看到数据库存在。在mySQL中创建数据库似乎没有正常工作

该程序最初检查数据库是否已经存在,以便我可以多次运行它。让我感到意外的是,当我第二次运行它时,它不知道数据库已经存在,因此它想要重新创建数据库。如果Netbeans看到它,为什么我的Java程序没有看到它? (我在授权声明中发现我的错误,所以我会修复它是正确的。)

我有删除数据库和用户的例程。在这里,如果我删除一个数据库,它将在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 - >服务 - >数据库下看到它。它目前没有表格。同样的错误是在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中的所有表。

感谢, 宜兰

回答

1

当你创建一个用户或模式,用户和模式是不一样的,但你必须添加一个用户权限的模式操作,并把它们丢失一旦放弃任他们。当您创建单独的语句以授予特权时,请确保该用户存在。 FLUSH语句重新加载mysql模式的权限以使其在用户连接后生效。如果该架构中没有记录,则效率较低。如果要访问数据库元数据,则还需要授予用户权限mysql模式,特别是在开发阶段。

+0

我不知道我明白你在说什么。我的代码首先创建数据库,然后检查用户是否存在。如果不是,他创建。如果他已经存在,他将被授予刚刚创建的数据库的特权。在connect2datbase(false,false)中,它会尝试连接到存在或不存在的数据库。如果失败connect2database(false,true)使用root密码连接到数据库mysql。这是你所指的模式?也许我应该连接到其他东西,而不是MySQL?我不知道我还能连接到什么。 –

+0

对不起,我做了一些愚蠢的事情。通过添加“调试信息”并创建表格,我在连接到mysql时做了它,而不是刚刚创建的数据库。愚蠢的...所以我回到我的原始代码没有添加表,但我无法连接到我的新创建的数据库与其用户。我不明白为什么不。 –

+0

在连接url中,您可以指定默认模式。 – 2013-11-03 11:18:27