web-dev-qa-db-ja.com

Spring BootおよびSpring JDBCを使用してOracleでデフォルトスキーマ= SOMETHINGを設定します

現在、OracleとSpring jdbcを使用していますが、SQLステートメントでスキーマを使用したくありません。

例:SCHEMA.tableから*を選択します

Application.propertiesまたはapplication.ymlにデフォルトのスキーマを設定する方法はありますか?

12
Jose Diaz Diaz

Springデータソースを使用してデータベース接続を定義すると仮定すると、データソース設定を定義するときにデフォルトのスキーマを設定できます。

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

詳細については、こちらをご覧ください。 Spring Boot Reference Guide。付録A.一般的なアプリケーションプロパティ


いくつかの調査を行った後、Oracleドライバーでは、ここで説明するように、使用するデフォルトのスキーマを設定できないように見えます。

Oracle接続URLのデフォルトスキーマ

その投稿から、次の2つのオプションがあります。

  1. ステートメントを実行する前にこのステートメントを実行します。

    ALTER SESSION SET CURRENT_SCHEMA=yourSchema
    
  2. テーブル/ビュー/などの同義語を作成します(データベース内の多くの要素について話している場合、これは非常に面倒です)。

最初のオプションを使用することをお勧めします。私が見るところ、Springブートは接続を取得するときにステートメントを実行する簡単な方法を提供しないので、最善の策はgetConnectionメソッド(または接続を取得するメソッド)の側面を使用することですデータソースから)そしてそこでステートメントを実行します。


あなたのコメントから、それを解決する簡単な方法は、spring.datasource.schema

spring.datasource.schema = schema.sql

そして、次のファイルsquema.sql

ALTER SESSION SET CURRENT_SCHEMA=mySchema
8
Luiggi Mendoza

春のブーツで、私はそれを行う別の方法を見つけました、

@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;
} 
7
Deepak

エンティティクラスを更新してこれを回避する別の方法を見つけました

@Table(schema = "SCHEMA_NAME" ,name = "TABLE_NAME")
3

Hikariを使用している場合は、spring.datasource.hikari.schema = YOUR_SCHEMAを使用します。 Oracleを使用したSpringBoot + Tomcatで動作します。

1
ANooBee

ユーザーとしてデータベースに接続すると、ログインするたびにスキーマを変更するトリガーを作成できます。

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

現在受け入れられている答え ;に問題がありました。具体的には、スキーマは最初の接続からのみ変更されます。アプリが接続プールを使用する場合、各接続にSQLを適用するようにプールを構成する必要があります。

たとえば、Spring Boot 1.5.x(Tomcat)でデフォルトのjdbcプールを使用する場合:

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

別のオプションは、データソースラッパーを作成することです。通常どおりデータソースを作成してから、getConnectionメソッドを除くすべてのメソッドを転送するラッパーを作成します。それらの場合、スキーマを設定するためにSQLを追加しました。複数のデータソースがあり、これによりデータソースごとに異なるスキーマを指定できました。これに問題があるかどうかを誰かが知っているなら、コメントをお願いします。または、プロパティを使用する代替手段がある場合。

0
David Bradley