PostgreSQL

PostgreSQL カレントスキーマを変更する

カレントスキーマを変更する

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=>
スポンサーリンク