カレントスキーマを変更する
postgreSQLには「カレントスキーマ」という言葉があります。スキーマ修飾を省略して各種オブジェクトを指定した際「まず最初に参照するスキーマ」の事です。また、このスキーマ参照順序をサーチパスといいます。デフォルトでは(”$user”, public)の順番でグローバル設定がされていますが、ユーザ毎にサーチパスを設定する事もできます。スキーマユーザとスキーマの違いを意識しないOracleにはない概念です。
私は当初「カレントスキーマ」を、LinuxやWindowsにおけるカレントディレクトリ、カレントフォルダと同様な概念でいましたが少し異なります。「カレントスキーマとは、サーチパスにおいて最も優先順位の高いスキーマの事」という認識のほうが正確だとおもいます。つまりLinuxなどにおけるディレクトリ移動(cd)という考え方もありません。
現状確認SQL
select current_schema;
SETコマンドによるサーチパス変更
変更SQL
set search_path to "public";
変更例
-- 現状確認
myposdb=> select current_schema;
current_schema
----------------
sooni
(1 行)
myposdb=>
-- カレントスキーマをpublicへ変更する
myposdb=# set search_path to "public";
SET
-- 変更している事確認できます。
myposdb=> select current_schema;
current_schema
----------------
public
(1 行)
myposdb=>
-- ログアウトし再度ログインした後確認すると元のカレントスキーマに
-- 戻っている事確認できます。
myposdb=# exit
D:\work>psql -U sooni -d myposdb -h vm022
psql (13.5, server 13.6)
Type "help" for help.
myposdb=> select current_schema;
current_schema
----------------
sooni
(1 行)
myposdb=>
set serche_pathによる変更後もトランザクションは継続します
set serche_path変更後もトランザクションは継続します。これを以下検証します。
-- 現在のカレントスキーマとログインユーザを確認する
myposdb=# select current_schema,current_user;
current_schema | current_user
----------------+--------------
sooni | sooni
(1 row)
-- トランザクションを開始する
myposdb=# begin;
BEGIN
-- トランザクションIDも確認する
myposdb=*# select txid_current();
txid_current
--------------
896
(1 row)
-- 変更前テーブル内容確認(0件です)
myposdb=*# select * from sooni.ex01;
c1
----
(0 rows)
-- 1件レコードをinsertする
myposdb=*# insert into ex01(c1) values (100);
INSERT 0 1
myposdb=*# select * from sooni.ex01;
c1
-----
100
(1 row)
-- トランザクション開始しているのでトランザクションIDは当然変化なしです
myposdb=*# select txid_current();
txid_current
--------------
896
(1 row)
-- ここでカレントスキーマを変更
myposdb=*# set search_path to "public";
SET
-- publicスキーマに変更した事確認できます
myposdb=*# select current_schema,current_user;
current_schema | current_user
----------------+--------------
public | sooni
(1 row)
--先ほどinsertしたレコードを確認すると期待通り入っています。
myposdb=*# select * from sooni.ex01;
c1
-----
100
(1 row)
-- ここでトランザクション終了(rollbackで戻してみます)
myposdb=*# rollback;
ROLLBACK
-- 以下の通りトランザクションはロールバックされました
myposdb=# select * from sooni.ex01;
c1
----
(0 rows)
-- トランザクションIDも想定通り進んでいます
myposdb=# select txid_current();
txid_current
--------------
897
(1 row)
myposdb=#
set_config()関数によるサーチパス変更
set_config()を使って変更する。第3パラメータにtrueを設定した場合、現状トランザクションにおいて変更が適用される事に対し、falseを設定すると現状セッションで変更が適用され続けます。
変更SQL
select pg_catalog.set_config('search_path','public',false) ;
変更例
myposdb=> select pg_catalog.set_config('search_path','public',false)
myposdb-> ;
set_config
------------
public
(1 行)
myposdb=> select current_schema;
current_schema
----------------
public
(1 行)
myposdb=>