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 撤廃も夢じゃない。
調べる
- bytea 型の使われどころ。なぜ BLOB に向かないか?
- 実質 text & 1GB 制限。
- PostgreSQLを用いたバイナリデータの入出力に関する検討
- MySQL でのアプローチ。
- 4種類の BLOB。
- 組み込み type とその定義方法
次の1手
- 組み込み type の定義方法
- craete table 時に trigger を作る方法