PostgreSQL が面白い

ここ数年、業務で PostgreSQL を使用している。アプリケーションのDBMSとして使うのはもちろんだが、最近はデータベースそのものの構築を自動化することを行っている。

データベースの内部を触ることが多いので、テーブルの構造を持っているテーブル(カタログ)を調べて、テーブルが存在しているかどうかをチェックする機能を作ったりしているが、その中で PostgreSQL 固有の機能で面白い機能を発見した。

PostgreSQL ではほかのDBMSと同じようにスキーマという単位でテーブル等を管理している。スキーマが違えば同じ名前のテーブルが存在することが出来る。テーブルをアクセスする際、スキーマ名で修飾しないでテーブルをアクセスすると、セッションの search_path という変数で羅列したスキーマの順でアクセスするテーブルを検索する。

テーブルが存在するかどうかを調べるためにはこのsearch_path のせいで複雑なSQLを組まないといけないと思っていたのだが、最近発見したある機能で、テーブルの存在チェックを簡単に出来ることがわかった。

その機能とはテーブル名の文字列を regclass というタイプでキャストするということ。たとえばtable_a というテーブルがDB内に存在ししかもアクセス可能かどうかを調べるためには次のようなSQLを使用する。

select 'table_a'::regclass

こうするだけで結果としてそのテーブルの OID が返ってくる。もし存在しなければエラーとなる。(OIDが返ってくるのだが実際にpsql や PgAdminIII でクエリ結果として表示されるのはテーブル名そのものになっている)

これを応用して、どのスキーマのテーブルが実際にアクセスされているかどうかを調べるSQLは

select nspname from pg_namespace n, pg_class c
where n.oid = c.relnamespace and c.oid ='table_a'::regclass::oid

あとはこのSQLを組み込み、テーブルが存在しなかったときのためにエラー処理を入れればよい。

PostgreSQL ではキャストも独自で定義できるようだ。なるほどこういう使い方も出来るのかと目からうろこの瞬間であった。


コメントを残す