在Java客户端中“动态”更改derbyDB架构

时间:2012-08-14 14:39:00

标签: java schema derby

我的应用程序中有一个嵌入式derbyDB,我正在测试我的代码。

如果我发送以下SQL代码

set current schema  [newSchemaName];
从ij

然后我可以设置架构和来自

的DB的响应
show tables;

将仅报告先前标识的newSchemaName中存在的表(尽管这似乎并不总是有效!)

如果我从java代码中执行类似的操作,然后执行

getCurrentConection.getSchema();

从上面返回的值永远不会提出在SQL中传递的newSchemaName(尽管如果我使用预准备语句,它会按预期返回newSchemaName)。

这是一些额外的背景信息......

我有默认数据库名称'derbyTest'并创建3个其他模式。 管理员 S1 S2 从逻辑上分离/隐藏用户不需要了解的信息

我需要在操作期间更改模式(例如:如果需要,管理员将更改模式以查看更多'精细'信息)。

为此,我为setSchema(String newSchemaName)创建了一个方法,该方法创建了模式(如果它尚不存在),然后连接到它。

但是在运行代码段之后

/**
*method to change to a given schema
*@param newSchemaName the new schema to change to
/
public void SetSchema(String newSchemaName){

String sql = newSchemaName.toUpperCase();//make sure the newSchemaName is in upper case.

ResultSet rs;
        try
        {
            rs = this.sendQry("select schemaName from sys.sysschemas where schemaname = '" + sql + "'");//does this schema exist in the DB
        if (rs.next()) 
        {//the schema already exists
                //send some messages to the user about the change of schema
            errLog.setDevError(1, "derbyDB schema" +sql +" already exists ");
            errLog.add(2, "connecting to " + sql);
                //next line create the SQL for changing to the newSchemaName supplied
            this.sendSQL("set current schema " + sql);//connect to the schema
                //log a message to display the current schema in the DB
                //this next log never shows a change to the newSchemaName unless
                //I use a prepared statement in my java code.
            errLog.add(1, "current DB schema is " + getCurrentConection.getSchema();
    }
        else{//the schema does not exist
        //send a message to the user and output log
        errLog.setDevError(1, "derbyDB schema" +sql +" does not exist ");
        //code to send message asking if user wants to create the new schema....
        }

}//end try
        catch{
//catch errors


}
}//end method

如果我查看文档http://db.apache.org/derby/docs/dev/ref/rrefsqlj32268.html来设置模式我的SQL是正确的,如果我直接从ij运行,代码就可以工作。

我知道ij和客户端之间存在一些差异(如描述的功能在客户端不起作用,你需要放弃元数据)。

设置架构声明的情况是否相同。或者这只是来自准备好的声明,我将要测试。

如果是这样,那就引出了为什么我只能从准备好的语句中更改模式的问题?

认真接受的想法和评论。

大卫

编辑: 准备好的语句适用于更改架构。所以现在只是第二个问题。为什么准备好的陈述和正常陈述之间的区别...谷歌的时间我认为?

编辑: 我不知道它是否有所作为,但我在Windows平台上,使用标准JDK(6),并在eclipse中运行jUnit测试的eclipse indigo。我还可以使用opendJDK在Linux(ubuntu)上测试它是否有助于排除故障。

1 个答案:

答案 0 :(得分:0)

我不确定你的问题是什么。

您可以在表引用中明确指定架构,如:

SELECT * FROM S1.TABLE_NAME

UPDATE S2.TABLE_NAME SET COL1=VALUE1

或者,如果您愿意,可以省略表引用中的模式名称,仅表示:

SELECT * FROM TABLE_NAME

UPDATE TABLE_NAME SET COL1=VALUE1

等,在这种情况下,您需要通过发出SET SCHEMA语句或使用现有的默认架构为这些语句建立隐式架构,该架构在您登录时与您的用户名相匹配。

我认为关于预准备语句与非预处理语句的问题与以下事实有关:如果未指定显式模式,则在准备语句时会建立默认模式名称。

如果是我,并且我关心我正在使用什么模式,我会在所有SQL语句中的所有表引用中明确指定模式,然后我会确定我在使用哪个模式。< / p>