我想在Oracle连接URL
中设置默认数据库模式
jdbc:oracle:thin:@<server>:<port1521>:<sid>
我的示例SQL语句:
select monkey_name from animals.monkey
我需要查询没有模式前缀animals。
的数据库,即当我运行此语句时
select monkey_name from monkey
默认情况下,它将使用animals
模式。
我需要在连接URL中指定什么才能达到这样的效果?
谢谢。
我想在Oracle连接URL
中设置默认数据库模式
jdbc:oracle:thin:@<server>:<port1521>:<sid>
我的示例SQL语句:
select monkey_name from animals.monkey
我需要查询没有模式前缀animals。
的数据库,即当我运行此语句时
select monkey_name from monkey
默认情况下,它将使用animals
模式。
我需要在连接URL中指定什么才能达到这样的效果?
谢谢。
连接URL中不能放任何内容。
在Oracle中,每个用户都有自己的模式(即使不包含任何对象),那是他们的默认模式。一旦登录/连接,他们可以使用一个命令来更改默认模式。
ALTER SESSION SET CURRENT_SCHEMA=animals
所以你需要在连接之后执行额外的语句。 可以在用户和/或数据库上设置登录触发器,在他们登录时运行此操作。我个人更喜欢在应用程序连接时明确执行该语句。
如果您使用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"));
同义词的使用如何?
create synonym monkey for animals.monkey;
select monkey_name from monkey
MY_APP_PREFIX_USER
(通常更简洁)。许多人认为这很丑陋,并希望使用默认模式而不是同义词的概念。 - coderatchetjava.sql.Connection
类中有一个setSchema
方法。oracle.jdbc.driver.PhysicalConnection
实现中,该方法执行alter session set current_schema = ?
语句。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;