Skip to content

Latest commit

 

History

History
84 lines (58 loc) · 6.2 KB

File metadata and controls

84 lines (58 loc) · 6.2 KB

論理削除 (削除フラグで非表示にする)

いつ使う: 「削除」ボタンを押しても物理的には消さず、削除フラグを立てるだけ。後から復活できる、または監査要件で履歴が必要な場合。

アプリの作り

論理削除の一覧画面

- 一般ユーザー画面: 「削除」ボタンを押すとレコードが見えなくなる (一覧から消える) - 管理画面: 削除済みレコードも表示。フラグを戻して復活できる

支えるデータ構造

soft_delete_items
├── id            PK
├── name          TEXT
└── LogicalDelete BOOLEAN  ← CLB 予約名 (この綴りでないと動かない)

モジュールとテーブルの対応

モジュール テーブル 役割
SoftDeleteItem soft_delete_items 一般ユーザー用。LogicalDelete 予約名で論理削除自動動作
SoftDeleteItemAdmin soft_delete_items (同じテーブル) 管理用。Boolean 名を予約名以外 (例: DeletedFlag) にして自動フィルタを回避
DeletedAtItem / DeletedAtItemAdmin deleted_at_items 削除時刻 (DeletedAt) を自動記録するバリエーション (標準パターン集)。下記参照
AuditDeleteItem / AuditDeleteItemAdmin audit_delete_items 削除者 + 削除時刻 (Deleter + DeletedAt) を自動記録する監査バリエーション (「認証・権限」グループ)。下記参照

CLB ではこう作る

  • BooleanFieldDesign を作って Name を必ず "LogicalDelete" にする (CLB の予約名)
  • これだけで CLB の削除ボタンが UPDATE SET LogicalDelete = true に変わる
  • 一覧表示時も LogicalDelete = false で自動フィルタされる
  • UI には出さず Fields にだけ定義 (一覧で空セルになるので)

バリエーション: 削除時刻・削除者を自動記録する (DeletedAt / Deleter)

LogicalDelete (Boolean) の代わりに、削除の 時刻実行者 を記録する予約名フィールドを置くと、CLB が論理削除時に自動でセットする。Boolean フラグは無くてもよい (DeletedAtDeleter のいずれかがあれば論理削除扱いになり、DeletedAtDeleter が値を持つ行=削除済みとして一覧から自動除外される)。

フィールド名 (予約名) 論理削除時の自動動作
DeletedAt DateTime 削除時刻を自動セット
Deleter Link → ユーザー (AppUser) 削除実行者 (ログインユーザー) を自動セット
  • DeletedAt は認証不要。時刻だけなのでログインの有無に関係なく動く
  • Deleter は認証が前提。ログインユーザーを AppUser へのリンクとして記録する (認証を外したアプリでは実行者を特定できず空になる)。標準パターン集ではサイドバー「認証・権限」グループに収録
  • 管理画面は LogicalDelete 版と同じく 別モジュール (同じテーブル) + フィールド名を予約名以外 (DeletedAtView / DeleterView) にして自動フィルタを回避し、削除済みの「いつ・誰が」を表示する。DeletedAtView を空にして更新すると復活する

標準パターン集の対応

  • サイドバー データ操作/論理削除/フラグSoftDeleteItem (一般画面)
  • サイドバー データ操作/論理削除/フラグ管理SoftDeleteItemAdmin (削除済も見える管理画面)
  • サイドバー データ操作/論理削除/時刻DeletedAtItem (一般画面、DeletedAt で削除時刻を自動記録)
  • サイドバー データ操作/論理削除/時刻管理DeletedAtItemAdmin (削除済の削除時刻を表示する管理画面)

標準パターン集の対応 (認証・権限)

  • サイドバー 認証・権限/削除監査 (削除者記録)AuditDeleteItem (一般画面、Deleter + DeletedAt で削除者・時刻を自動記録)
  • 管理画面 (AdminFrame) サイドバー 削除監査 (管理)AuditDeleteItemAdmin (削除済の「いつ・誰が」を表示)

バリエーション: 別テーブルへ退避してから物理削除する (DeleteArchive)

「消したデータは残したいが、元テーブルは肥大化させたくない」場合は、行を残す論理削除ではなく、削除時に別テーブル(退避テーブル)へコピーしてから元テーブルから物理削除する方式が使える。DeleteArchiveField を Module に 1 つ置くだけで削除操作がこの動作に切り替わる。

  • 元テーブルは常に「生きているデータだけ」になり、削除済みは退避テーブルに集まる
  • 退避テーブルは元テーブルと同じ列 + 任意の削除日時・削除者列で作る
  • 復活は退避テーブルからの手動リストアになる(論理削除のフラグ戻しほど手軽ではない)
  • 論理削除(LogicalDelete / DeletedAt / Deleter)とは併用できない(デザインチェックでエラー)。どちらか一方を選ぶ

詳細は DeleteArchiveField を参照。

落とし穴

  • フィールド名は必ず LogicalDelete の綴り。IsDeleted 等の任意名だと CLB の自動動作が効かない
  • 管理画面用は 別モジュール (同じテーブルを参照) + Boolean 名を予約名以外にして自動フィルタを回避
  • DeletedAtDateTimeDeleterLink (→ AppUser) で作る。型が違うと削除マーカーとして認識されない
  • Deleter / DeletedAt は論理削除時に CLB が自動でセットするので、スクリプトで代入する必要はない (Creator/CreatedAt と同じ)

関連ドキュメント