在mySQL中创建数据库似乎无法正常工作

时间:2013-11-03 08:03:00

标签: java mysql jdbc ddl

我想让Java为我创建一个数据库和一个用户。我正在使用Netbeans,以便我可以看到存在哪些数据库。当我创建数据库时,我可以在Netbeans中看到 - >服务 - >数据库所在的数据库。

程序最初检查数据库是否已存在,以便我可以多次运行它。令我感到惊讶的是,当我第二次运行它时,它不知道数据库已经存在,因此它想要重新创建数据库。如果Netbeans看到它,为什么我的Java程序没有看到它? (我在grant语句中发现了我的错误,因此我会将其修复为正确。)

我有删除数据库和用户的例程。在这里,如果我删除数据库,它也会消失在Netbeans中 - >服务 - >数据库。

用户的情况没有问题。如果我删除用户然后创建数据库,它将识别用户不存在,并创建他。如果我只删除数据库,它会识别出用户已经存在。

我将为drop database和user包含一些代码片段:

    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下看到了它 - >服务 - >数据库。它目前没有表格。错误再次出现在授权声明中....

以下是创建数据库的例程:

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 个答案:

答案 0 :(得分:1)

当您创建用户或架构时,用户和架构不同,但您必须添加用户权限才能对架构进行操作,并且一旦丢弃其中任何一个架构,它们就会丢失。创建单独的语句以授予权限时,请确保用户存在。 FLUSH语句从mysql模式重新加载priv,以便在用户连接后使其生效。如果该模式中没有记录,则效果较差。如果要访问数据库元数据,则还需要向mysql模式授予用户权限,尤其是在开发阶段。