データ保持ポリシーと自動化: 必要なものを保持し、必要なものを削除

法的要件、保持スケジュール、自動適用、GDPR、SOX、HIPAA のコンプライアンス検証を備えたデータ保持ポリシーを構築します。

E
ECOSIRE Research and Development Team
|2026年3月16日4 分で読める838 語数|

Compliance & Regulationシリーズの一部

完全ガイドを読む

データ保持ポリシーと自動化: 必要なものを保持し、必要なものを削除

企業は法的に必要なデータよりも平均 33% 多くのデータを保持しており、ストレージ コストと侵害の危険性の両方が増大しています。 データ保持には、法的コンプライアンス、コストの最適化、セキュリティが集約されます。保持しすぎると攻撃対象領域が増加します。保持額が少なすぎると、訴訟ホールドの要件に違反します。

このガイドでは、保持ポリシーの設計、データ タイプ別の法的要件、および手動介入なしで組織のコンプライアンスを維持するための自動適用について説明します。

重要なポイント

  • 保存期間は、法的要件、ビジネス ニーズ、プライバシー義務の交差点によって決定されます。
  • 自動化された強制が不可欠 --- 手動削除プロセスの失敗率は 40%
  • 同じシステム内のデータ型が異なると、保持期間も異なる場合があります
  • 訴訟が予想される場合、訴訟ホールドは標準の保持ポリシーをオーバーライドする必要がある

規制による保存期間要件

最小保存要件

データ型GDPRSOX (米国)税法 (さまざま)ヒパア業界標準
財務記録最小値なし(目的制限)7年3 ~ 10 年 (国別)該当なし7年
従業員記録雇用期間 + 2 ~ 6 年該当なし解雇後 3 ~ 7 年該当なし解雇から 7 年
顧客 PII目的に必要な限り該当なし該当なし該当なし関係が終了 + 2 年になったら削除
健康記録該当なし該当なし該当なし作成/最終発効日から 6 年州によって異なります (最長 30 年)
税務書類該当なし7年3 ~ 10 年 (国別)該当なし7年
契約該当なし期間 + 7 年該当なし該当なし期間 + 6 年 (時効)
採用データ最大 6 か月 (ベスト プラクティス)該当なし該当なし該当なし6~24か月
サポートチケット必要な限り該当なし該当なし該当なし閉店から3年
監査ログ必要な限り7年該当なし6年7年
マーケティング同意同意の期間該当なし該当なし該当なし撤退まで+2年

国別の税金留保

保存期間メモ
米国3~7年IRS: 通常 3 年、詐欺罪で 7 年
イギリス6年HMRC 要件
ドイツ10年EU で最も厳しい
フランス6 年 (一部の場合は 10 年)コード・デ・コマース
オランダ7年財政上の注意
オーストラリア5年ATO 要件
カナダ6年CRA 要件
インド8年所得税法
アラブ首長国連邦5年連邦税務当局

保持スケジュールの設計

ステップ 1: インベントリ データ カテゴリ

カテゴリーシステムオーナーデータの例
顧客データCRM、eコマース、サポート販売名前、メールアドレス、注文履歴
従業員データHRIS、給与、福利厚生人事SSN、給与、パフォーマンスのレビュー
財務データ会計、ERP、銀行金融請求書、領収書、納税申告
マーケティングデータ電子メール プラットフォーム、分析マーケティングキャンペーンデータ、同意記録
製品データERP、eコマースオペレーション製品仕様、価格、在庫
操作ログアプリケーションサーバー、データベースITアクセスログ、エラーログ、監査証跡

ステップ 2: 保存期間の割り当て

カテゴリごとに、次の階層を使用して保存期間を決定します。

  1. 法的最低限度: 法律では何を守る必要がありますか?
  2. 法的な最大値: 法律では何を削除する必要がありますか? (GDPR目的の制限)
  3. ビジネス上の必要性: 実際にどのくらいの期間必要ですか?
  4. リスク許容度: 保存する場合と削除する場合のコストはどれくらいですか?

保存期間は次のとおりです: MAX (法定最小値、ビジネス上の必要性) ただし、法定最大値 (該当する場合) を超えてはなりません。

ステップ 3: 廃棄アクションの定義

アクション説明いつ使用するか
削除すべてのコピーを永久に削除します期限切れデータのデフォルト
匿名化識別要素を削除し、集計を維持分析、研究
アーカイブ制限された暗号化ストレージに移動訴訟ホールド、コンプライアンスアーカイブ
集計個々のレコードを概要に置き換える財務報告

自動保存の強制

PostgreSQL の実装

-- Retention policy table
CREATE TABLE retention_policies (
    id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
    table_name VARCHAR(100) NOT NULL,
    date_column VARCHAR(100) NOT NULL,
    retention_days INTEGER NOT NULL,
    action VARCHAR(20) NOT NULL, -- 'DELETE', 'ANONYMIZE', 'ARCHIVE'
    condition TEXT, -- Optional WHERE clause
    enabled BOOLEAN DEFAULT TRUE,
    last_run TIMESTAMP,
    records_affected INTEGER DEFAULT 0
);

-- Insert policies
INSERT INTO retention_policies (table_name, date_column, retention_days, action, condition) VALUES
('support_tickets', 'closed_at', 1095, 'ANONYMIZE', 'status = ''closed'''),
('recruitment_candidates', 'applied_at', 730, 'DELETE', 'status != ''hired'''),
('session_logs', 'created_at', 90, 'DELETE', NULL),
('newsletter_unsubscribed', 'unsubscribed_at', 365, 'DELETE', NULL),
('audit_logs', 'created_at', 2555, 'ARCHIVE', NULL);

-- Enforcement function
CREATE OR REPLACE FUNCTION enforce_retention_policies()
RETURNS TABLE(policy_id UUID, table_name TEXT, records_affected BIGINT) AS $$
DECLARE
    policy RECORD;
    affected BIGINT;
    query TEXT;
BEGIN
    FOR policy IN
        SELECT * FROM retention_policies WHERE enabled = TRUE
    LOOP
        IF policy.action = 'DELETE' THEN
            query := format(
                'DELETE FROM %I WHERE %I < NOW() - INTERVAL ''%s days''',
                policy.table_name, policy.date_column, policy.retention_days
            );
            IF policy.condition IS NOT NULL THEN
                query := query || ' AND ' || policy.condition;
            END IF;
        ELSIF policy.action = 'ANONYMIZE' THEN
            -- Anonymization requires table-specific logic
            -- This is a simplified example
            query := format(
                'UPDATE %I SET email = ''[email protected]'', name = ''Anonymized'' WHERE %I < NOW() - INTERVAL ''%s days''',
                policy.table_name, policy.date_column, policy.retention_days
            );
            IF policy.condition IS NOT NULL THEN
                query := query || ' AND ' || policy.condition;
            END IF;
        END IF;

        EXECUTE query;
        GET DIAGNOSTICS affected = ROW_COUNT;

        UPDATE retention_policies
        SET last_run = NOW(), records_affected = affected
        WHERE id = policy.id;

        RETURN QUERY SELECT policy.id, policy.table_name::TEXT, affected;
    END LOOP;
END;
$$ LANGUAGE plpgsql;

スケジュール設定

# Run retention enforcement daily at 3 AM
# /etc/cron.d/retention-enforcement
0 3 * * * postgres psql -d ecosire -c "SELECT * FROM enforce_retention_policies();" >> /var/log/retention-enforcement.log 2>&1

訴訟ホールド

訴訟ホールドが適用される場合

訴訟ホールドは、訴訟が予想される場合、係争中、または進行中の場合に、通常の保持ポリシーを一時停止します。関連する可能性のあるデータはすべて、保持スケジュールに関係なく保存する必要があります。

実装

-- Legal hold table
CREATE TABLE legal_holds (
    id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
    matter_name VARCHAR(255) NOT NULL,
    description TEXT,
    custodians TEXT[], -- Users whose data is held
    tables_affected TEXT[], -- Tables where retention is suspended
    created_at TIMESTAMP DEFAULT NOW(),
    released_at TIMESTAMP,
    created_by UUID REFERENCES users(id)
);

-- Modified retention enforcement respects legal holds
CREATE OR REPLACE FUNCTION enforce_retention_with_holds()
RETURNS void AS $$
BEGIN
    -- Skip tables under active legal hold
    DELETE FROM session_logs
    WHERE created_at < NOW() - INTERVAL '90 days'
    AND 'session_logs' NOT IN (
        SELECT UNNEST(tables_affected)
        FROM legal_holds
        WHERE released_at IS NULL
    );
END;
$$ LANGUAGE plpgsql;

検証とコンプライアンス

毎月の保持監査

  • すべての保持ポリシーが文書化されており、最新のものです。
  • 自動適用は正常に実行されました (ログを確認してください)
  • 保存期間を超えたデータは存在しません(サンプルチェック)
  • 訴訟ホールドは係属中のすべての訴訟に対して有効です
  • 新しいデータ カテゴリに保存期間が割り当てられました
  • サードパーティのプロセッサは保持要件に準拠しています

よくある質問

GDPR に基づいて必要以上にデータを保持するとどうなりますか?

必要な保存期間を超えて個人データを保存することは、GDPR の保存制限原則 (第 5 条(1)(e))に違反します。監督当局は最大2,000万ユーロまたは世界の年間売上高の4%の罰金を課すことができる。より現実的には、過剰なデータにより侵害の危険が増大します。所有すべきではなかったデータに対して責任を負うことになります。

バックアップ コピーの保持はどのように処理すればよいですか?

バックアップには特定の時点のデータのスナップショットが含まれるため、保存が複雑になります。オプション: (1) 最長の保存期間に合わせたスケジュールでバックアップをローテーションする、(2) バックアップを暗号化し、保存期限が切れたら暗号化キーを破棄する (「暗号シュレッディング」)、(3) バックアップに期限切れのデータが含まれる可能性があることを受け入れるが、これを補償制御による技術的制限として文書化します。

Odoo で保持を実装するにはどうすればよいですか?

Odoo には保存の自動化が組み込まれていません。 (1) 古いレコードをアーカイブまたは匿名化するスケジュールされたアクション (cron ジョブ)、(2) 特定のモデルに保持ルールを強制するカスタム モジュール、(3) 一括操作のためのデータベース レベルの関数を使用して実装します。 ECOSIRE は、自動化されたデータ ライフサイクル管理のための Odoo カスタマイズ を提供します。


次に何が起こるか

データ保持は、完全なガバナンス プログラムのコンポーネントの 1 つです。新しいシステムの場合は プライバシー バイ デザイン、人事データの場合は 従業員データのプライバシー、サードパーティ プロセッサの場合は ベンダー契約管理 と組み合わせます。

データ保持ポリシーの設計と実装に関するコンサルティングについては、ECOSIRE にお問い合わせください


ECOSIRE が発行 -- 企業がライフサイクル全体を通じてデータを管理できるように支援します。

E

執筆者

ECOSIRE Research and Development Team

ECOSIREでエンタープライズグレードのデジタル製品を開発。Odoo統合、eコマース自動化、AI搭載ビジネスソリューションに関するインサイトを共有しています。

Compliance & Regulationのその他の記事

監査準備チェックリスト: ERP によって監査が 60% 高速化される方法

ERP システムを使用して監査準備チェックリストを完了します。適切な文書化、管理、自動化された証拠収集により、監査時間を 60% 削減します。

Cookie 同意実装ガイド: 法的に準拠した同意管理

GDPR、eプライバシー、CCPA、および世界的な規制に準拠した Cookie 同意を実装します。同意バナー、Cookie の分類、CMP の統合について説明します。

国境を越えたデータ転送規制: 国際的なデータ フローをナビゲートする

SCC、十分性決定、BCR を使用して国境を越えたデータ転送規制をナビゲートし、GDPR、英国、および APAC 準拠のための転送影響評価を行います。

地域別のサイバーセキュリティ規制要件: グローバル ビジネス向けのコンプライアンス マップ

米国、EU、英国、APAC、中東にわたるサイバーセキュリティ規制をナビゲートします。 NIS2、DORA、SEC ルール、重要なインフラストラクチャ要件、コンプライアンスのタイムラインをカバーします。

データ ガバナンスとコンプライアンス: テクノロジー企業のための完全ガイド

コンプライアンス フレームワーク、データ分類、保持ポリシー、プライバシー規制、テクノロジー企業向けの実装ロードマップを網羅した完全なデータ ガバナンス ガイド。

従業員データのプライバシー管理: 人事ニーズとプライバシー権のバランスをとる

GDPR 要件、人事データ処理根拠、監視ポリシー、国境を越えた転送、保持のベスト プラクティスを使用して従業員データのプライバシーを管理します。

WhatsAppでチャット