[pgsql-jp: 25688] Re: ラージオブジェクトの削除後の領域開放

sugita @ sra.co.jp sugita @ sra.co.jp
2002年 4月 24日 (水) 11:42:48 JST


  杉田です。

From: "kumiko naito" <naito @ mdsnet.co.jp>
Subject: [pgsql-jp: 25684] Re: ラージオブジェクトの削除後の領域開放
Date: Wed, 24 Apr 2002 11:20:32 +0900

;;; create table image (name text,raster oid) の場合、このテーブルに格納されてい
;;; るのは
;;; oidだけで、実際のラージオブジェクトは別の場所にあるわけですよね。
;;; この実際のオブジェクトを何らかの方法で削除しなければならないという事でしょう
;;; か?

  はい。

;;; イメージ的にはOracleの BLOB型(DB内でラージオブジェクトを保持・管理する)
;;; では無く、
;;; BFILE型(管理情報のみをDBに格納し、実際のデータは外部に持つ)に近いと
;;; 考えたほうが良いのでしょうか?

  データはデータベース内にあります。

;;; 現在は検証のため、ローカルDBにpsqlでアクセスしていますが、実際のシステムで
;;; は
;;; JDBC経由になります。(本番サーバはSolarisになると思います。)
;;; 
;;; すみませんが、明示的な開放のしかたを、もう一度、ご教授いただけますでしょうか
;;; ?

  JDBC による直接の例は、他の方にお願いします。

  JDBC に関わらず、次のようにして、カタログ化されたレコードを削除したときに、
BLOB を自動的に削除することもできます。

    -- テーブル定義
    DELETE FROM icon_catalog;
    DROP TABLE icon_catalog;
    DROP SEQUENCE icon_catalog_id_seq;
    CREATE TABLE icon_catalog
    (
	id       SERIAL,
	name     TEXT    NOT NULL,
	width    INTEGER NOT NULL,
	height   INTEGER NOT NULL,
	data_oid OID     NOT NULL,

	CONSTRAINT check_name     CHECK(length(name) > 0),
	CONSTRAINT check_width    CHECK(width > 0),
	CONSTRAINT check_height   CHECK(height > 0),
	CONSTRAINT check_data_oid CHECK(data_oid > 0)
    );

    COMMENT ON TABLE icon_catalog IS 'アイコンカタログ';
    COMMENT ON COLUMN icon_catalog.name IS 'アイコンのベースファイル名';
    COMMENT ON COLUMN icon_catalog.width IS 'アイコンのピクセル幅';
    COMMENT ON COLUMN icon_catalog.height IS 'アイコンのピクセル高';
    COMMENT ON COLUMN icon_catalog.data_oid IS 'アイコンデータのラージオブジェクトID';

    -- icon_catalog のインデックス定義
    CREATE INDEX icon_catalog_name_idx ON icon_catalog(name);

=>  -- icon_catalog のレコード削除時に、アイコンデータを BLOB から削除するトリガーの定義
=>  DROP FUNCTION icon_catalog_after_delete();
=>  CREATE FUNCTION icon_catalog_after_delete() RETURNS OPAQUE AS '
=>  DECLARE
=>	sql TEXT;
=>  BEGIN
=>	sql := ''SELECT lo_unlink('' || OLD.data_oid || '')'';
=>	EXECUTE sql;
=>	RETURN NULL;
=>  END;
=>  ' LANGUAGE 'plpgsql';

    COMMENT ON FUNCTION icon_catalog_after_delete()
	IS 'icon_catalogレコードの削除時に対応するBLOBを削除';

=>  CREATE TRIGGER icon_catalog_after_delete_hook AFTER DELETE
=>	ON icon_catalog FOR EACH ROW
=>	EXECUTE PROCEDURE icon_catalog_after_delete();

    COMMENT ON TRIGGER icon_catalog_after_delete_hook ON icon_catalog
	IS 'icon_catalogレコードの削除時に対応するBLOBを削除';


Kenji Sugita
sugita @ sra.co.jp



pgsql-jp メーリングリストの案内