MW211 EXIT

devlog
PostgreSQL/条件でログを削除する
2012年09月02日
年月日時分秒ごとにデータを記録しているログデータについて、
翌日になったらクリアしてから追加していくトリガ関数は以下のような感じ
┌──────────────────────────────────────┐
│DECLARE                                                                     │
│    pl_yyyymmdd CHAR(8);                                                    │
│                                                                            │
│BEGIN                                                                       │
│    SELECT INTO pl_yyyymmdd                                                 │
│                SUBSTR("yyyymmddhhiiss", 1, 8) AS "yyyymmdd"                │
│        FROM 表;                                                            │
│                                                                            │
│    IF TG_OP = 'INSERT' THEN                                                │
│        IF SUBSTR(NEW.yyyymmddhhiiss, 1, 8) <> pl_yyyymmdd THEN             │
│            DELETE FROM 表;                                                 │
│                                                                            │
│            RETURN NEW;                                                     │
│        END IF;                                                             │
│    END IF;                                                                 │
│                                                                            │
│    RETURN NEW;                                                             │
│END;                                                                        │
└──────────────────────────────────────┘
こいつをトリガとして登録すればOK。
┌──────────────────────────────────────┐
│CREATE TRIGGER トリガ                                                       │
│  BEFORE INSERT                                                             │
│  ON 表                                                                     │
│  FOR EACH ROW                                                              │
│  EXECUTE PROCEDURE トリガ関数();                                           │
└──────────────────────────────────────┘
これってINSERTの度に判断するんだろうけど、負荷がかかるのだろうか?

DELETEに代えてTRUNCATE TABLEにしようとしたら、エラーとなった。
┌──────────────────────────────────────┐
│DECLARE                                                                     │
│    pl_yyyymmdd CHAR(8);                                                    │
│                                                                            │
│BEGIN                                                                       │
│    SELECT INTO pl_yyyymmdd                                                 │
│                SUBSTR("yyyymmddhhiiss", 1, 8) AS "yyyymmdd"                │
│        FROM 表;                                                            │
│                                                                            │
│    IF TG_OP = 'INSERT' THEN                                                │
│        IF SUBSTR(NEW.yyyymmddhhiiss, 1, 8) <> pl_yyyymmdd THEN             │
│            TRUNCATE TABLE 表;                                              │
│                                                                            │
│            RETURN NEW;                                                     │
│        END IF;                                                             │
│    END IF;                                                                 │
│                                                                            │
│    RETURN NEW;                                                             │
│END;                                                                        │
└──────────────────────────────────────┘
これからINSERTしようとする表をDDLのレベルでは操作できないようだ。
ま、全件削除ってより、1ヶ月過ぎたのを削除とかが普通かも。
分類:PostgreSQL