EXTENSION機能の限界?
PostgreSQLの9.1から導入されたEXTENSIONの機構は、単にインストールスクリプトの隠蔽というだけでなく、パッケージに属する作成オブジェクト一覧の表示や、パッケージのバージョン管理もやってくれる便利な機構なんだけど、ちょっとだけ困ったことがある・・・。
今使っていて、ちょっと困っているのは以下のようなケース。
- 新しいインデクス機構を作成すると、インデクスアクセスメソッドを手動で pg_am システムカタログに挿入しないといけない。
- この機構をサポートするコマンド等は現状はない。PostgreSQL文書ではこう書いてある。
現時点では、pg_am項目の作成や削除に関する特別な補助はありません。 新しいアクセスメソッドを作成することができる人間ならば、適切な行を挿入できる能力があると想定しています。
- なので CREATE EXTENSION 内で pg_am に対して自分でINSERT文を使ってインデクスアクセスメソッドの定義を挿入することになる。
- ここまではいいのだが、DROP EXTENSIONをしたときに、CREATE EXTENSION内で挿入したインデクスアクセスメソッドは自動的には削除してくれない。
- 自分で作成したオブジェクトは依存関係を見て削除してくれるのだけど、 pg_am は自分で作ったものではなく、単にレコードを挿入しただけなので・・・
- DROP後に、再度同じEXTENSIONを CREATE EXTENSIONで登録しようとすると、pg_am への挿入で失敗する。><
こういう再登録時にエラーになるのを防止するためには、
- CREATE EXTENSIONでINSERTする前に、該当するアクセスメソッドの定義をDELETEしてから、INSERTするようにする。
- 単純なINSERTではなく WITH句+RETURNINGを使って、UPSERTっぽいクエリにする
といった方法もあるが、DROP EXTENSIONしても pg_am に残骸が残ってしまうのはちょっと気持ち悪い・・・。
あとは、
いうのもあるが、これはこれで、せっかくEXTENSION機構があるのに間が抜けている気もする。
かといって、
- pg_extensionテーブルにトリガ(そもそも設定できるんだっけ?)を仕掛けて削除時に連動して pg_am を削除する
というのも考えたがあまりに乱暴な気もする・・・。
まあ、インデクスアクセスメソッドの登録とかは例外的なケースなので、EXTENSION機構ではカバーしない領域なのかもしれないけど、なにかスマートな解決方法はないものかしら・・・。
誰かスマートな解決方法を知ってる人がいたら教えてほしいです。>PostgreSQLに詳しい人