21. large object の auto-delete を考える - PostgreSQL のソースコードを読む

Auto-delete large objects when referencing row is deleted
contrib/lo offers this functionality.

を見てみよう。
contrib/lo にあるのは lo_manage という C 言語で書かれたトリガと lo 型。

   CREATE TABLE image (title TEXT, raster lo);

   CREATE TRIGGER t_raster BEFORE UPDATE OR DELETE ON image
     FOR EACH ROW EXECUTE PROCEDURE lo_manage(raster);

のようにユーザーがトリガを仕掛けて、トリガが large object を消してくれる。

欠点

  • ユーザーはトリガを仕掛け忘れるかもしれない。
  • drop table/truncate table に対応していない

ではどうすればよいか?

PostgreSQL のサーバーに、lo オブジェクト型を定義して、必ずトリガが張られるようにすれば良いのかな。
ラージオブジェクトが lo 型(中身は oid だけど)で管理されるようになるので、oid 撤廃も夢じゃない。

調べる

次の1手

  • 組み込み type の定義方法
  • craete table 時に trigger を作る方法