2010-03-01 7 views
28

mi piacerebbe impostare lo schema del database predefinito in Oracle Connection URLschema predefinito in Oracle URL Connection

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

La mia dichiarazione di esempio SQL:

select monkey_name from animals.monkey 

ho bisogno di interrogare database senza schema prefisso animals. vale a dire quando Eseguo questa dichiarazione

select monkey_name from monkey 

utilizzeràSchemaper impostazione predefinita.

Che cosa è necessario specificare nell'URL di connessione sopra ottenere tale effetto?

Grazie.

risposta

29

Non è possibile inserire nulla nell'URL di connessione.

In Oracle ogni utente ha il proprio schema (anche se non contiene alcun oggetto) e questo è il loro schema predefinito. Una volta registrati nel/collegato, possono cambiare il loro schema di default con una

ALTER SESSION SET CURRENT_SCHEMA=animals 

Così avresti bisogno di fare la dichiarazione in più dopo il collegamento. È possibile avere un trigger di accesso sull'utente e/o sul database che verrà eseguito quando accedono. Personalmente preferirei una dichiarazione esplicita quando un'applicazione si connette.

+0

Questo appare come qualcosa che posso lavorare intorno ad esso. Creare il trigger di accesso con questa affermazione potrebbe essere la mia possibile soluzione. Grazie. – netic

+0

Ora posso vedere che questa dovrebbe essere una soluzione. Avendo attivato questo accesso, non è necessario modificare il mio sql. Quindi tutte le dichiarazioni generiche sono ancora portatili. – netic

9

E l'utilizzo di sinonimi?

create synonym monkey for animals.monkey; 

select monkey_name from monkey 
+0

È una buona idea. Tuttavia, trovo che non è definito, non sono sicuro se ci sono effetti collaterali che potrebbero rompere le cose lungo la strada. – netic

+4

+ Questa soluzione è abbastanza comune e funziona bene. –

+2

Questa è in genere la scelta migliore per alterare la sessione poiché sposta il problema da un aspetto comportamentale a uno strutturale, che è molto più robusto. – mwhs

9

Se si utilizza C3PO si può fargli fare quando si controlla il collegamento fuori.

come proprietà:

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

Come codice Java:

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

lato negativo è ciò avverrà ogni volta che la connessione è preso fuori dalla piscina.

Se si utilizza una connessione JDBC da soli si può solo fare:

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"));