web-dev-qa-db-fra.com

Définir le schéma par défaut = SOMETHING dans Oracle à l'aide de Spring Boot et Spring JDBC

Je travaille maintenant avec Oracle et spring jdbc mais je ne souhaite pas utiliser le schéma dans mes instructions SQL:

Exemple: Sélectionnez * dans SCHEMA.table 

Est-il possible de définir un schéma par défaut dans application.properties ou application.yml?

7
Jose Diaz Diaz

En supposant que vous définissiez vos connexions à la base de données à l'aide de sources de données spring, vous pouvez définir le schéma par défaut lors de la définition de la configuration de la source de données:

spring.datasource.schema = #value for your default schema to use in database

Vous trouverez plus d’informations ici: Guide de référence du démarrage du printemps. Annexe A. Propriétés d'application courantes


Après quelques recherches, on dirait que le pilote Oracle ne vous permet pas de définir un schéma par défaut, comme indiqué ici:

Schéma par défaut dans l'URL de connexion Oracle

A partir de ce post, vous avez deux options:

  1. Exécutez cette instruction avant d’exécuter vos instructions:

    ALTER SESSION SET CURRENT_SCHEMA=yourSchema
    
  2. Créez des synonymes pour vos tables/views/etc (ce que je trouve vraiment fastidieux si nous parlons de beaucoup d’éléments dans votre base de données).

Je conseillerais d'utiliser la première option. D'après ce que je vois, Spring Boot n'offre pas un moyen simple d'exécuter une instruction lors de la récupération de la connexion. Le mieux est donc d'utiliser un aspect de la méthode getConnection (ou de la méthode permettant d'extraire la connexion de la source de données). et exécutez la déclaration ici.


À partir de votre commentaire, un moyen plus simple de le résoudre consiste à utiliser un script dans spring.datasource.schema:

spring.datasource.schema = schema.sql

Et puis un fichier squema.sql avec ce qui suit:

ALTER SESSION SET CURRENT_SCHEMA=mySchema
7
Luiggi Mendoza

Au printemps, j'ai trouvé un autre moyen de le faire,

@Bean
@ConfigurationProperties(prefix="spring.datasource")
public DataSource dataSource(@Value("${spring.datasource.schema}") String schema) {
    DataSource datasource = DataSourceBuilder.create().build();
    if(!schema.isEmpty() && datasource instanceof org.Apache.Tomcat.jdbc.pool.DataSource){
            ((org.Apache.Tomcat.jdbc.pool.DataSource) datasource).setInitSQL("ALTER SESSION SET CURRENT_SCHEMA=" + schema);
    }
    return datasource;
} 
6
Deepak

J'ai trouvé un autre moyen de contourner ce problème en mettant à jour la classe d'entité avec 

@Table(schema = "SCHEMA_NAME" ,name = "TABLE_NAME")
2
Rakesh Mothukuri

En vous connectant à la base de données en tant qu'utilisateur, vous pouvez créer un déclencheur qui modifiera le schéma chaque fois que vous vous connecterez:

CREATE OR REPLACE TRIGGER LOGON_TRG 
  AFTER LOGON ON SCHEMA
BEGIN
     EXECUTE IMMEDIATE 'ALTER SESSION SET CURRENT_SCHEMA = foo';
EXCEPTION 
  when others 
    then null;
END;
/  
1
Jean de Lavarene

J'avais des problèmes avec la réponse actuellement acceptée ; spécifiquement, le schéma ne serait modifié qu'à partir de la connexion initiale. Si votre application utilise un pool de connexions, vous devez configurer le pool pour appliquer le code SQL à chaque connexion.

Par exemple, en utilisant le pool jdbc par défaut dans Spring Boot 1.5.x (Tomcat):

spring.datasource.Tomcat.init-s-q-l = ALTER SESSION SET CURRENT_SCHEMA=mySchema
1
Michael R

Une autre option consiste à créer un wrapper de source de données. Créez la source de données normalement, puis créez le wrapper qui transfère toutes les méthodes à l'exception des méthodes getConnection. Pour ceux que je viens d'ajouter SQL pour définir le schéma. Nous avons plusieurs sources de données, ce qui nous a permis de spécifier un schéma différent pour chaque source de données. Si quelqu'un sait s'il y a un problème avec cela, j'adorerais les commentaires. Ou s'il y a une alternative qui utilise les propriétés.

0
David Bradley