属于我们的Compliance & Regulation系列
阅读完整指南数据保留策略和自动化:保留您需要的内容,删除您必须的内容
公司保留的数据平均比合法需要的数据多 33%,从而增加了存储成本和泄露风险。 数据保留是法律合规性、成本优化和安全性的融合点。保留太多会增加攻击面。保留太少就会违反法律保留要求。
本指南涵盖保留策略设计、数据类型的法律要求以及无需人工干预即可保持组织合规的自动执行。
要点
- 保留期限由法律要求、业务需求和隐私义务的交叉点决定
- 自动执行至关重要 --- 手动删除流程的失败率为 40%
- 同一系统内不同数据类型可能有不同的保留期限
- 当预计发生诉讼时,法律保留必须优先于标准保留政策
法规的保留期限要求
最低保留要求
| 数据类型 | 通用数据保护条例 | SOX(美国) | 税法(可变) | 健康保险流通与责任法案 | 行业标准 |
|---|---|---|---|---|---|
| 财务记录 | 无最低限度(目的限制) | 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 年 | 英国税务海关总署要求 |
| 德国 | 10年 | 欧盟最严格 |
| 法国 | 6 年(有些人 10 年) | 商业代码 |
| 荷兰 | 7 年 | Fiscale bewaarplicht |
| 澳大利亚 | 5 年 | ATO 要求 |
| 加拿大 | 6 年 | CRA 要求 |
| 印度 | 8 年 | 所得税法 |
| 阿联酋 | 5 年 | 联邦税务局 |
设计保留计划
第 1 步:库存数据类别
| 类别 | 系统 | 业主 | 数据示例 |
|---|---|---|---|
| 客户资料 | CRM、电子商务、支持 | 销售 | 姓名、电子邮件、订单历史记录 |
| 员工资料 | HRIS、薪资、福利 | 人力资源 | SSN、薪资、绩效评估 |
| 财务数据 | 会计、ERP、银行业 | 金融 | 发票、收据、税务申报 |
| 营销数据 | 电子邮件平台、分析 | 营销 | 活动数据、同意记录 |
| 产品数据 | ERP、电子商务 | 运营 | 产品规格、定价、库存 |
| 操作日志 | 应用服务器、数据库 | 信息技术 | 访问日志、错误日志、审计跟踪 |
第 2 步:指定保留期
对于每个类别,使用以下层次结构确定保留期:
- 法定最低限度:法律要求您保留什么?
- 法律最高限度:法律要求您删除什么? (GDPR 目的限制)
- 业务需求:您实际需要多长时间?
- 风险承受能力:保留它与删除它的成本是多少?
保留期限为:最长(法定最低期限,业务需要),但不得长于法定最长期限(如果适用)。
第 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) 条)。监管机构可处以最高 2000 万欧元或全球年营业额 4% 的罚款。更实际的是,过多的数据会增加您遭受泄露的风险——您要对不应该拥有的数据负责。
我们如何处理备份副本的保留?
备份使保留变得复杂,因为它们包含特定时间点的数据快照。选项:(1) 按照与最长保留期一致的计划轮换备份,(2) 加密备份并在保留到期时销毁加密密钥(“加密粉碎”),(3) 接受备份可能包含过期数据,但将其记录为具有补偿控制的技术限制。
我们如何在 Odoo 中实现保留?
Odoo 没有内置的保留自动化功能。使用以下方式实现它:(1) 对旧记录进行归档或匿名化的计划操作(cron 作业),(2) 在特定模型上强制执行保留规则的自定义模块,(3) 用于批量操作的数据库级函数。 ECOSIRE 提供 Odoo 定制 来实现自动化数据生命周期管理。
接下来会发生什么
数据保留是完整治理计划的组成部分之一。将其与新系统的隐私设计、HR 数据的员工数据隐私 以及第三方处理器的供应商合同管理 相结合。
联系 ECOSIRE 获取数据保留策略设计和实施咨询。
由 ECOSIRE 发布——帮助企业在整个生命周期中管理数据。
作者
ECOSIRE TeamTechnical Writing
The ECOSIRE technical writing team covers Odoo ERP, Shopify eCommerce, AI agents, Power BI analytics, GoHighLevel automation, and enterprise software best practices. Our guides help businesses make informed technology decisions.
相关文章
更多来自Compliance & Regulation
电子商务网络安全:2026 年保护您的业务
2026 年完整电子商务网络安全指南。PCI DSS 4.0、WAF 设置、机器人防护、支付欺诈预防、安全标头和事件响应。
化工行业 ERP:安全、合规性和批量处理
ERP 系统如何管理化学品公司的 SDS 文件、REACH 和 GHS 合规性、批量处理、质量控制、危险品运输和配方管理。
适用于进出口贸易的 ERP:多货币、物流与合规性
ERP 系统如何为贸易公司处理信用证、海关文件、国际贸易术语解释通则、多币种损益表、集装箱跟踪和关税计算。
使用 ERP 进行可持续发展和 ESG 报告:2026 年合规指南
通过 ERP 系统在 2026 年实现 ESG 报告合规性。涵盖 CSRD、GRI、SASB、范围 1/2/3 排放、碳追踪和 Odoo 可持续性。
审核准备清单:准备好您的书籍
完整的审计准备清单,涵盖财务报表准备情况、支持文件、内部控制文件、审计员 PBC 清单和常见审计结果。
澳大利亚电子商务企业商品及服务税指南
完整的澳大利亚电子商务企业 GST 指南,涵盖 ATO 注册、75,000 美元门槛、低值进口、BAS 申报和数字服务 GST。