您在此处:
Archive Apex — 被遗忘的权利 (RTBF)
数据隐私条例授予个人被遗忘的权利 (RTBF),要求组织根据请求安全删除个人数据。Archive Apex 通过从 Archive 应用程序识别和删除特定数据来实现合规性,确保彻底删除,同时保留其他已归档数据的完整性。
RTBF 筛选条件
要处理 RTBF 请求,请指定适当的筛选条件。例如:
| 标准 | 示例 |
|---|---|
| 字段名 | 员工 ID |
| 对象 | 联系人 |
| 值 | ID 123456789011121314 |
重要注意事项
- 提交限制为每天 10,000 个请求,根记录搜索限制为 10,000 个。
- RTBF 删除过程扩展到层次结构中直接和间接相关的子记录。
- 重叠搜索结果会将一些记录标记为已在审计文件中删除。
- 如果达到搜索结果限制,Apex 活动状态会显示带有此错误的
200状态代码。Request processed. Maximum search results reached. Refine your search or submit a new request. - 大多数标准 RTBF 请求在 30 分钟内完成。
- 为了获得最佳结果,请针对根对象。
- 对象和字段名称筛选器不区分大小写。
- 归档不支持部分删除。
已归档层次结构中子记录的 RTBF 行为
在子记录上执行 RTBF 请求时,该请求会删除与其关联的整个归档层次结构。
例如,如果您搜索特定个案记录并提交归档 RTBF 请求,该请求会删除个案、关联的任务和相关的客户根记录。因为这些记录是一起归档的,所以 RTBF 会删除整个归档的层次结构。
但是,如果客户单独归档,在个案记录上运行 RTBF 只会删除个案及其任务,而不会删除客户记录。
RTBF 的工作原理
RTBF 进程作为异步进程运行,并遵循这些顺序 API 调用。
- 数据识别 — Apex 查询归档,以查找匹配指定筛选条件的所有记录。
- 数据删除 — Apex 向归档发送删除请求,删除所有匹配的记录。
在流程完成时,RTBF 活动图标会显示在归档控制台的活动选项卡下方。
RTBF 请求示例
前员工 Maria Johnson 提交了 RTBF 请求,要求将所有个人数据从系统中删除。贵公司将员工记录及其电子邮件通信、客户互动和项目分配归档。要遵循 RTBF 请求,使用此筛选条件。
| 对象 | 字段名 | 值 |
|---|---|---|
| 联系人 | 电子邮件 | Maria@own.com |
| 个案 | 员工 ID | 987654321 |
| 任务 | 被分配人 | 瑪麗亞·強森 |
| 电子邮件 | 发件人 | Maria@own.com |
| 文档 | 所有者 | 瑪麗亞·強森 |
该请求确保完全删除 Maria 的数据,包括她的联系信息、她参与的个案、分配给她的任务以及与她链接的所有电子邮件和文档记录。此流程有助于保持对数据隐私条例的遵守,同时确保彻底准确地删除敏感信息。
API 方法和响应处理
我们建议在提交 RTBF 请求之前,通过在 Apex 数据查询中运行查询来验证您的条件。
| 输入 | 输出 | 定义 |
|---|---|---|
ArchiverAccessorResponse |
|
来自“忘记 API”调用的响应。返回使用 getRTBFStatus 方法跟踪请求的状态的requestId。 |
Criteria(字符串sObjectName、字符串fieldName、字符串value) |
||
forgetArchivedRecords(list<Criteria>
inputFilters) |
ArchiverAccessorResponse |
创建“忘记归档请求”和删除条件列表的公共方法。 |
getRTBFStatus(string requestId) |
包含已删除信息的所有详细信息的 CSV 报表。 | 公共方法,使您能够跟进 RTBF 请求。 |
- Archive Apex — 运行 RTBF 请求
手动测试 Archive Apex,并在 Archive 应用程序中运行 RTBF 请求。 - Archive Apex — RTBF 用例场景
归档应用程序中 RTBF 的用例场景。 - Archive Apex — 在归档应用程序中匿名化 PII
匿名化已归档记录中的个人身份信息 (PII),而无需删除记录本身。匿名化使用不可逆的占位符替换敏感值,以帮助您遵守隐私条例,同时保留归档应用程序的记录结构。
Archive Apex — 运行 RTBF 请求
手动测试 Archive Apex,并在 Archive 应用程序中运行 RTBF 请求。
- 单击设置图标。
- 选择开发人员控制台。
-
要打开控制台,请在 Windows 上按
F12或Ctrl+Shift+I,或在 Mac 上按Cmd+E。 -
在控制台中,执行此代码以创建条件列表,发送 RTBF 请求,并从归档获取
requestId。SF_Archive.Criteria criteria1 = new SF_Archive.Criteria('Account', 'Name', 'example name'); list<SF_Archive.Criteria> lst = new list<SF_Archive.Criteria>(); lst.add(criteria1); SF_Archive.ArchiverAccessorResponse response = SF_Archive.ArchiverAccessor.forgetArchivedRecords(lst); Map<String, String> values = (Map<String, String>)JSON.deserialize(response.getBody(), Map<String, String>.class); String requestId = values.get('request_id'); system.debug(requestId); -
单击执行。
请求开始。完成后,
requestId会存储在执行日志中。
查看 RTBF 请求的状态
发送 RTBF 请求后,您可以查看请求的状态。
- 在页面右上角,单击设置图标。
- 选择开发人员控制台。
-
按
Command + E。 -
使用 RTBF 请求的
requestId,运行此代码。SF_Archive.ArchiverAccessorResponse reportResponse = SF_Archive.ArchiverAccessor.getRTBFStatus(requestId); system.debug(reportResponse.getBody()); -
单击执行。
状态请求开始。完成后,这些状态之一会显示在执行日志中。
Request failed, please contact support.请求不成功,并失败。
Request handled, no matching results were found.:没有匹配指定条件的记录。
Request is open. Scan is still in progress.请求仍在处理中。
当请求成功完成时,您会收到一个 CSV 报表,其中包含已删除信息的所有详细信息。
CSV 报表包含此信息。
| 字段 | 备注 |
|---|---|
| 条件记录 | 匹配请求的删除条件的记录字段。 |
| 条件记录类型 | 请求的条件。 |
| 引发删除的相关 Salesforce ID | 表中另一个记录引用的行也匹配该条件。 |
| Salesforce ID | 报表行中包含的记录的 ID。 |
| 状态 | 表示是否删除记录。 |
Archive Apex — RTBF 用例场景
归档应用程序中 RTBF 的用例场景。
场景 1:包含多个对象的 RTBF
Jane Doe 是 XYZ Bank 的客户,她在过去的 2 年里一直在该银行开户。最近,她决定根据《通用数据保护条例》(GDPR) 行使她的 RTBF。Jane 认为银行保存了她不必要的个人数据,并希望将其从他们的记录中删除。
Jane 向 XYZ 银行提交她的 RTBF 请求,并指定她想删除的个人数据,这些数据可以包括账户信息、交易历史和银行持有的任何其他个人数据。银行会继续识别并查找 Jane 的个人数据。
| 标准 | 筛选器 | 筛选器 | 筛选器 | 筛选器 |
|---|---|---|---|---|
| 对象 | 客户 | Transaction_c | 个案 | 电子邮件 |
| 字段名 | 名称 | 交易用户 | 客户名 | 发件人 |
| 值 | 無名氏 | 無名氏 | 無名氏 | 無名氏 |
RTBF 请求可以包含最多 10 个单独对象。
结果:
归档查找 1 个客户、2000 个交易、15 个个案作为根和 30 封电子邮件。
场景 2:RTBF 单对象
一家制药公司发布了一种实验药物,艾迪仙丹,用于治疗关节炎。然而,它导致患者出现严重的不良反应。在召回该药物后,该公司提交了 RTBF 请求,以删除与 Eddy's Elixirs 相关的所有公开记录和数字内容。
| 标准 | 筛选器 |
|---|---|
| 对象 | 个案 |
| 字段名 | 药物名称 |
| 值 | 愛迪精靈 |
结果:
归档会将 1000 个个案作为根记录,并将 1000 个患者记录作为子记录归档到根记录下。这会将它们全部移除。
在“归档控制台活动”选项卡中创建一个活动,显示 RTBF 图标。
场景 3:RTBF 找到超过 10,000 个根记录
Emily Jones 是热门社交媒体平台 ConnectWorld 的常规用户,她停用账户,并请求根据数据保护条例行使 RTBF。
| 对象 | 筛选器 | 筛选器 | 筛选器 |
|---|---|---|---|
| 对象 | 用户帐户 | 联系人 | 个案 |
| 字段名 | 名称 | 电话 | 相关 ID |
| 值 | Emily Jones 的客户 ID | Emily 的电话号码 | Emily Jones 的客户 ID |
结果:
归档会查找 20,000 个根个案记录,300,000 个联系人和 10,000 个个案作为根记录,150,000 个联系人作为子记录在根记录下归档。
在“归档控制台活动”选项卡中创建一个活动,显示 RTBF 图标。
getRTBFStatus 返回状态代码 200,错误消息为“请求已处理。已达到最大搜索结果数量。优化搜索或提交新请求以查看更多记录”。
对于每个 RTBF Apex 请求,归档最多只能处理 10,000 个根记录。要解决此错误,请再次运行查询以检索剩余记录。
Archive Apex — 在归档应用程序中匿名化 PII
匿名化已归档记录中的个人身份信息 (PII),而无需删除记录本身。匿名化使用不可逆的占位符替换敏感值,以帮助您遵守隐私条例,同时保留归档应用程序的记录结构。
匿名化,也称为屏蔽,帮助您遵守隐私请求,例如被遗忘的权利 (RTBF)。此流程会对已归档记录执行就地更新。与永久删除数据的清除操作不同,匿名化使用通用文本替换特定的敏感值,例如 redacted@example.com。
匿名化的工作原理
系统使用对象元数据检测 PII 字段,例如姓名、电子邮件、电话和地址。在您提交请求时,系统会使用不可恢复的占位符屏蔽原始 PII 值。非 PII 数据(例如记录 ID 和时间戳)保持不变,可以搜索。
匿名化是全面的。在您匿名化根记录时,匿名化过程会自动层叠到同一归档层次结构中的所有相关子记录。例如,匿名化联系人记录也会匿名化该记录相关任务和事件中的 PII。
重要注意事项
- 匿名化过程是永久性的。匿名化后,您无法恢复或查看原始 PII 值。
- 您只能匿名记录一次。如果您提交匿名记录的重复请求,系统会忽略它。
- 匿名化共享每个组织每天 10,000 次请求的标准归档 RTBF 速率限制。
- 您无法手动选择要匿名化的字段。系统会根据恢复算法自动识别 PII 字段。
- 您不能匿名化合法持有的记录。系统会自动排除当前处于合法保留或保留锁定中的记录。
另请参阅:
提交匿名化请求
定义您的目标条件,并使用 SF_Archive.ArchiverAccessor Apex 类提交匿名作业。
请确保满足这些要求。
- 运行 Apex 代码的用户有权访问
SF_Archive命名空间。 - 访问开发人员控制台或 IDE,以运行匿名执行 Apex。
- 打开开发人员控制台或您的首选 Apex 执行工具。
- 打开匿名执行窗口。
-
要定义条件并提交请求,请运行此代码。此代码块会将联系人记录中的电子邮件地址字段匿名化。
// 1. Define the criteria for the records to anonymize. // Syntax: new Criteria('ObjectAPIName', 'FieldAPIName', 'ValueToMatch'); List<SF_Archive.Criteria> criteriaList = new List<SF_Archive.Criteria>(); // Example: Anonymize a specific Contact by Email criteriaList.add(new SF_Archive.Criteria( 'Contact', 'Email', 'mickey.mouse@example.com' )); // 2. Submit the anonymization request. SF_Archive.ArchiverAccessorResponse response = SF_Archive.ArchiverAccessor.maskArchivedRecords(criteriaList); // 3. Process the response to get the request ID. Map<String, String> values = (Map<String, String>)JSON.deserialize(response.getBody(), Map<String, String>.class); String requestId = values.get('request_id'); // Output the request ID for tracking. System.debug('Anonymization Job Submitted. Request ID: ' + requestId);
验证匿名化状态
检查匿名化作业的状态,并使用提交期间生成的请求 ID 生成审计报告。
匿名化是一个异步过程。提交请求后,使用返回的请求 ID 跟踪进度并验证结果。
-
要检查匿名化作业状态,请在“执行匿名”窗口中运行此代码。
// Paste the Request ID found in the Debug Log from the anonymization request. // Example: String requestId = '0Qn5e000000abcD'; String requestId = 'YOUR_REQUEST_ID_HERE'; // Check the status. String statusResponse = SF_Archive.ArchiverAccessor.getMaskingStatus(requestId); System.debug('Anonymization Job Status: ' + statusResponse); -
要在匿名化作业完成后生成审计报告,请在“匿名执行”窗口中运行此代码。
String requestId = 'YOUR_REQUEST_ID_HERE'; String report = SF_Archive.ArchiverAccessor.getMaskingReport(requestId); System.debug('Anonymization Audit Report: ' + report);
匿名化结果
查看匿名化过程完成后 PII 字段的显示方式。当作业状态为“HANDLED”时,系统会立即更新归档的数据。
- 使用原始 PII(例如电子邮件地址)的搜索不会返回结果。
- 使用记录 ID 等非敏感标识符的搜索会返回匿名记录。
- 当您通过搜索、导出或取消归档查看记录时,PII 字段会显示占位符值。
| 字段 | 原始值 | 匿名值 |
|---|---|---|
| 名称 | 米老鼠 | redacted_first_name |
| 电子邮件 | mickey.mouse@example.com | redacted@example.com |
| 电话 | +1-415-555-1234 | 000-000-0000 |
| ContactId | 003XX0000123AbC | 003XX0000123AbC |

