在 DERBY 查询中省略模式

Posted

技术标签:

【中文标题】在 DERBY 查询中省略模式【英文标题】:Omit schema in the DERBY Query 【发布时间】:2013-03-22 00:47:35 【问题描述】:

我创建了一个名为“movie_db”的数据库,将默认模式设置为 APP。 然后创建了一个名为“USERS”的示例表。

我与 DB 的连接如下:

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">

    <property name="driverClassName" value="org.apache.derby.jdbc.ClientDriver"/>
    <property name="url" value="jdbc:derby://localhost:1527/movie_db"/>        
    <property name="username" value="root"/>
    <property name="password" value="pass"/>
</bean>

现在我想编写一些测试并尝试执行以下查询:

SELECT * FROM USERS;

我得到了什么:

java.sql.SQLSyntaxErrorException: Table/View 'USERS' does not exist.

当我准确指定我正在使用的架构时:

SELECT * FROM APP.USERS

一切正常。

如何在查询中省略架构名称?

更新: 就像 Bryan 说的,我用我的默认模式的名称创建了一个用户,并使用这个登录名进行授权。这是在查询中省略模式名称的最简单方法。但是,如果我想使用多个模式,唯一的方法就是显式设置模式。

【问题讨论】:

【参考方案1】:

控制默认模式名基本上有两种方式:

    连接到数据库后发出 SET SCHEMA 语句。 以与您要使用的架构同名的用户身份登录。

如果您尚未发出 SET SCHEMA 语句,那么 Derby 将使用您的用户名作为架构名称。

因此,如果您以用户“APP”身份登录,并且不发出 SET SCHEMA 语句,那么您的架构名称将是 APP。

【讨论】:

我可以在我的 bean 中显式设置模式吗?我尝试通过设置属性并在 url 中添加键值对,但这对我不起作用。如果不可能,那么设置默认架构的最佳方式到底是哪里?在DAO类的各个访问DB的方法里面? SET SCHEMA 是一条 SQL 语句;您需要使用 JDBC API 将该语句发送到数据库。听起来您真正的问题涉及如何获取对象/关系库发出的此类 SQL 语句,这实际上不是 Derby 问题,而是 O/R 库问题。 不,我知道 set schema 是一个 sql 语句 :) 首先,现在我没有使用 orm,但这不是我的问题。我实际上不明白为什么我不能在应用程序上下文的数据源块内为我的连接池设置默认架构。我不想硬编码我的架构。 我解决了同样的问题,但使用了特定的 WAS 替代方案:***.com/questions/19032112/… 不知道您是否可以在您的环境中做同样的事情。 第二个声明的官方文档是here。

以上是关于在 DERBY 查询中省略模式的主要内容,如果未能解决你的问题,请参考以下文章

达梦数据库查询时如何省略表前面的模式名

Nacos在derby模式下密码忘记了如何更改密码?nacos使用derby的ij工具修改密码

Nacos在derby模式下密码忘记了如何更改密码?nacos使用derby的ij工具修改密码

Hive 3Hive 的安装配置(本地derby模式)

如何运行 sql 脚本以从 java 代码更新 Derby 模式?

Spring Cloud Alibaba - 20 Nacos StandAlone模式下的数据存储(Derby)及新增登录用户