Oracle连接URL中的默认模式

51

我想在Oracle连接URL中设置默认数据库模式

jdbc:oracle:thin:@<server>:<port1521>:<sid>

我的示例SQL语句:

select monkey_name from animals.monkey

我需要查询没有模式前缀animals。的数据库,即当我运行此语句时

select monkey_name from monkey

默认情况下,它将使用animals模式。

我需要在连接URL中指定什么才能达到这样的效果?

谢谢。

5个回答

45

连接URL中不能放任何内容。

在Oracle中,每个用户都有自己的模式(即使不包含任何对象),那是他们的默认模式。一旦登录/连接,他们可以使用一个命令来更改默认模式。

ALTER SESSION SET CURRENT_SCHEMA=animals

所以你需要在连接之后执行额外的语句。 可以在用户和/或数据库上设置登录触发器,在他们登录时运行此操作。我个人更喜欢在应用程序连接时明确执行该语句。


这看起来像是我可以解决的问题。使用这个语句创建登录触发器可能是我的可行解决方案。谢谢。 - netic
1
我现在可以看到,这应该是一个解决方案。通过使用这个登录触发器,我不必修改我的SQL。因此,所有通用语句仍然是可移植的。 - netic

14

如果您使用C3PO,则可以在它检查连接时让其执行此操作。

作为属性:

c3p0.preferredTestQuery=alter session set current_schema=animals
c3p0.testConnectionOnCheckout=true

作为Java代码:

ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setPreferredTestQuery("alter session set current_schema=animals");
dataSource.setTestConnectionOnCheckout(true);

缺点是每次从池中取出连接时都会发生这种情况。

如果您自己在使用JDBC连接,您可以只执行:

Class.forName("oracle.jdbc.driver.OracleDriver");
Connection connection = getConnection("jdbc:oracle:thin:@//server:1521/instance",   "username", "password");
connection.createStatement().execute("alter session set current_schema=animals"));

我需要给实例用户授予权限吗?我通过本地主机访问Oracle,连接为“jdbc:oracle:thin:@localhost:1521:xe”,这个连接可以工作。但当我尝试用创建的用户更改xe时,它无法连接并出现错误“ORA-12505,TNS:侦听器当前不知道在连接描述符中给出的SID”。 - user3153014

12

同义词的使用如何?

create synonym monkey for animals.monkey;

select monkey_name from monkey

这是一个好主意。然而,我认为它并不确定,我不确定是否有任何副作用会在途中破坏事情。 - netic
2
这通常是更好的选择,因为它将问题从行为方面转移到了结构方面,这样更加健壮。 - mwhs
尽管这对大多数情况都有效,但在许多企业环境中,单个数据库中将存在多个应用程序模式。如果原始表名没有使用前缀创建,则会出现命名空间冲突。例如 MY_APP_PREFIX_USER(通常更简洁)。许多人认为这很丑陋,并希望使用默认模式而不是同义词的概念。 - coderatchet
如果您使用公共同义词,coderathet就是正确的。尽可能使用私有同义词是明智的选择,这可以避免这种名称冲突。 - Amit Naidu

3
自从Java 1.7版本以来,java.sql.Connection类中有一个setSchema方法。
在Oracle的oracle.jdbc.driver.PhysicalConnection实现中,该方法执行alter session set current_schema = ?语句。

2
您可以使用连接数据库用户创建触发器来更改当前模式。
create or replace trigger SET_SCHEMA_AFTER_LOGON
    after logon on database
begin
     execute immediate 'alter session set CURRENT_SCHEMA=animals';
end SET_SCHEMA_AFTER_LOGON;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接