現在、OracleとSpring jdbcを使用していますが、SQLステートメントでスキーマを使用したくありません。
例:SCHEMA.tableから*を選択します
Application.propertiesまたはapplication.ymlにデフォルトのスキーマを設定する方法はありますか?
Springデータソースを使用してデータベース接続を定義すると仮定すると、データソース設定を定義するときにデフォルトのスキーマを設定できます。
spring.datasource.schema = #value for your default schema to use in database
詳細については、こちらをご覧ください。 Spring Boot Reference Guide。付録A.一般的なアプリケーションプロパティ
いくつかの調査を行った後、Oracleドライバーでは、ここで説明するように、使用するデフォルトのスキーマを設定できないように見えます。
その投稿から、次の2つのオプションがあります。
ステートメントを実行する前にこのステートメントを実行します。
ALTER SESSION SET CURRENT_SCHEMA=yourSchema
テーブル/ビュー/などの同義語を作成します(データベース内の多くの要素について話している場合、これは非常に面倒です)。
最初のオプションを使用することをお勧めします。私が見るところ、Springブートは接続を取得するときにステートメントを実行する簡単な方法を提供しないので、最善の策はgetConnection
メソッド(または接続を取得するメソッド)の側面を使用することですデータソースから)そしてそこでステートメントを実行します。
あなたのコメントから、それを解決する簡単な方法は、spring.datasource.schema
:
spring.datasource.schema = schema.sql
そして、次のファイルsquema.sql
ALTER SESSION SET CURRENT_SCHEMA=mySchema
春のブーツで、私はそれを行う別の方法を見つけました、
@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;
}
エンティティクラスを更新してこれを回避する別の方法を見つけました
@Table(schema = "SCHEMA_NAME" ,name = "TABLE_NAME")
Hikariを使用している場合は、spring.datasource.hikari.schema = YOUR_SCHEMAを使用します。 Oracleを使用したSpringBoot + Tomcatで動作します。
ユーザーとしてデータベースに接続すると、ログインするたびにスキーマを変更するトリガーを作成できます。
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;
/
現在受け入れられている答え ;に問題がありました。具体的には、スキーマは最初の接続からのみ変更されます。アプリが接続プールを使用する場合、各接続にSQLを適用するようにプールを構成する必要があります。
たとえば、Spring Boot 1.5.x(Tomcat)でデフォルトのjdbcプールを使用する場合:
spring.datasource.Tomcat.init-s-q-l = ALTER SESSION SET CURRENT_SCHEMA=mySchema
別のオプションは、データソースラッパーを作成することです。通常どおりデータソースを作成してから、getConnectionメソッドを除くすべてのメソッドを転送するラッパーを作成します。それらの場合、スキーマを設定するためにSQLを追加しました。複数のデータソースがあり、これによりデータソースごとに異なるスキーマを指定できました。これに問題があるかどうかを誰かが知っているなら、コメントをお願いします。または、プロパティを使用する代替手段がある場合。