何故そんなことがしたいのか
特に何も設定をせずにPostgreSQLで
select * from test;
というSQLを発行すると、
select * from public.test;
というようにpublicというスキーマのtestテーブルを参照します。
今回、上記のような特に何も設定していない本番環境をリプレースする機会がありました。
その際にスキーマをDB作成時にデフォルトで作成されるpublicではなく別途作成し、そのスキーマ内に同じ構成で作成することとなりました。
テーブル、ビューの構成は同じなのでプロジェクト内で発行する全てのSQLは同じでOKなワケです。ただ、スキーマの指定だけを全てのSQLで指定してあげる必要がある・・・
プロジェクトではS2JTAとJDBCを利用していたので、これらの設定で解決を試みます。
JDBC接続文字列で対応
PostgreSQL JDBC Driverの公式ドキュメントを見てみると下記のような記載がありました。
currentSchema (String) Default null
https://jdbc.postgresql.org/documentation/use/
Specify the schema (or several schema separated by commas) to be set in the search-path. This schema will be used to resolve unqualified object names used in statements over this connection.
雑に要約するとこの指定を行った接続では非修飾オブジェクトの名前解決に指定したスキーマ名を使用してくれるとのことです。
ということで、DB接続の設定ファイルjdbc.diconの接続文字列にcurrentSchemaの指定を追加します。
jdbc:postgresql://[ホスト]/[DB]?currentSchema=[スキーマ]
これにてプロジェクトの全てのSQLでスキーマを指定するような振る舞いとなってくれました。
たとえば[スキーマ]にtargetschemaと指定したとすると
select * from test;
と発行したSQLが
select * from targetschema.test;
と同じようになります。

コメント