对文档修订版执行编校 - Amazon Quantum Ledger Database (Amazon QLDB)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

对文档修订版执行编校

在 Amazon QLDB,DELETE 语句只能通过创建将文档标记为已删除的新修订版,从逻辑上删除文档。QLDB 还支持数据编校操作,允许您永久删除表历史记录中的非活动文档修订版本。

注意

2021 年 7 月 22 日之前创建的任何分类账目前都不符合编校资格。您可在 Amazon QLDB 控制台查看分类账的创建时间。

编校操作仅删除指定修订版中的用户数据,而日记账序列和文档元数据则保持不变。这样可保持分类账的整体数据完整性。

在开始在 QLDB 中进行数据编校之前,请务必在Amazon QLDB PartiQL 参考中查看修订注意事项和限制

编校存储过程

您可以使用 REDACT_REVISION 存储过程永久删除分类账中单个非活动修订版本。此存储过程将删除索引存储和日志存储中指定修订版本中的所有用户数据。但是,它将使日记账序列和文档元数据 (包括文档 ID 和哈希) 保持不变。该操作不可逆。

指定的文档修订版本必须是在历史记录中处于非活动状态的修订版。文档的最新有效修订版不符合此编校条件。

若要编校多个修订版,必须为每个修订版运行一次存储进程。您可为每笔事务编校一个修订版。

语法

EXEC REDACT_REVISION `block-address`, 'table-id', 'document-id'
Arguments
`block-address`

要编校的文档修订版本的日记账数据块位置。地址是一种包含两个字段的 strandIdAmazon Ion 结构:即 和 sequenceNo

这是一个 Ion 字面值,以反引号表示。例如:

`{strandId:"JdxjkR9bSYB5jMHWcI464T", sequenceNo:17}`
'table-id'

待编校修订版本的表的唯一 ID,用单引号表示。

'document-id'

待编校修订版本的唯一文档 ID,用单引号表示。

检查编校是否已完成

通过运行此存储过程提交编校请求后,QLDB 将异步处理数据的编校。完成后,修订版中的用户数据 (由 data 结构表示) 将被永久删除。若要检查编校请求是否已完成,您可以使用以下方法之一:

修订版本编校完成后,修订版本的 data 结构将被新dataHash字段所取代。该字段的值是已移除 data 结构的 Ion 哈希,如下例所示。因此,分类账保持了其整体数据的完整性,并通过现有验证 API 操作保持加密可验证性。要了解有关验证的更多信息,请参阅Amazon QLDB 中的数据验证

编校示例

以您之前在查询修订历史记录中查看过的车辆登记文件为例。假设您要编校第二个修订版 (version:1)。以下查询示例显示了编校之前的此修订版。在查询结果中,将要编校的data结构以红色斜体突出显示。

SELECT * FROM history(VehicleRegistration) AS h WHERE h.metadata.id = 'ADR2Ll1fGsU4Jr4EqTdnQF' --replace with your id AND h.metadata.version = 1
{ blockAddress:{ strandId:"JdxjkR9bSYB5jMHWcI464T", sequenceNo:17 }, hash:{{LGSFZ4iEYWZeMwmAqcxxNyT4wbCtuMOmFCj8pEd6Mp0=}}, data: { VIN: "1HVBBAANXWH544237", LicensePlateNumber: "LS477D", State: "WA", PendingPenaltyTicketAmount: 42.20, ValidFromDate: 2011-10-26T, ValidToDate: 2023-09-25T, Owners: { PrimaryOwner: { PersonId: "KmA3XPKKFqYCP2zhR3d0Ho" }, SecondaryOwners: [] }, City: "Bellevue" }, metadata:{ id:"ADR2Ll1fGsU4Jr4EqTdnQF", version:1, txTime:2019-06-05T21:01:442d-3Z, txId:"9cArhIQV5xf5Tf5vtsPwPq" } }

请注意查询结果中的blockAddress,因为您需要将此值传递给REDACT_REVISION存储过程。然后,通过查询系统目录找到VehicleRegistration 表的唯一 ID,如下所示。

SELECT tableId FROM information_schema.user_tables WHERE name = 'VehicleRegistration'

使用此表 ID 以及文档 ID 和数据块地址即可运行REDACT_REVISION。表 ID 和文档 ID 是字符串文字,必须用单引号括起来,数据块地址是用反引号括起的 Ion 文字。确保将这些参数替换为自己的值。

EXEC REDACT_REVISION `{strandId:"JdxjkR9bSYB5jMHWcI464T", sequenceNo:17}`, '5PLf9SXwndd63lPaSIa0O6', 'ADR2Ll1fGsU4Jr4EqTdnQF'
提示

当您使用 QLDB 控制台或 QLDB Shell 查询表 ID 或文档 ID(或任何字符串文字值)时,返回的值用引号括起来。但是,在指定REDACT_REVISION存储进程的表 ID 和文档 ID 参数时,必须用引号将这些值括起来。

这是因为您以 PartiQL 格式编写语句,但 QLDB 会以 Amazon Ion 格式返回结果。有关 QLDB 中 PartiQL 的语法和语义详细信息,请参阅使用 PartiQL 查询 Ion

有效的编校请求会返回一个 Ion 结构,该结构表示您正在编校的文档修订版,如下所示。

{ blockAddress: { strandId: "JdxjkR9bSYB5jMHWcI464T", sequenceNo: 17 }, tableId: "5PLf9SXwndd63lPaSIa0O6", documentId: "ADR2Ll1fGsU4Jr4EqTdnQF", version: 1 }

通过运行此存储过程后,QLDB 将异步处理的编校请求。编校完成后,该data 结构将被永久删除,并由一个新 dataHash 字段取而代之。该字段的值是已移除 data 结构的 Ion 哈希,如下所示。

注意

dataHash 示例仅供参考,不是实际计算的哈希值。

{ blockAddress:{ strandId:"JdxjkR9bSYB5jMHWcI464T", sequenceNo:17 }, hash:{{LGSFZ4iEYWZeMwmAqcxxNyT4wbCtuMOmFCj8pEd6Mp0=}}, dataHash: {{s83jd7sfhsdfhksj7hskjdfjfpIPP/DP2hvionas2d4=}}, metadata:{ id:"ADR2Ll1fGsU4Jr4EqTdnQF", version:1, txTime:2019-06-05T21:01:442d-3Z, txId:"9cArhIQV5xf5Tf5vtsPwPq" } }

删除和编校当前修订版本

有效文档修订版(即每个文档中未删除的最新修订版)不符合数据编校的条件。必须先更新或删除当前修订版本,然后才能对其进行编校。这会将先前处于活动状态的修订版本移至历史记录,使其有资格进行编校。

如果您的用例要求将整个文档标记为已删除,则首先使用DELETE语句。例如,以下语句在逻辑上删除 VIN为1HVBBAANXWH544237VehicleRegistration文档。

DELETE FROM VehicleRegistration AS r WHERE r.VIN = '1HVBBAANXWH544237'

然后,如前所述,在删除之前编校之前的修订版。如果需要,您也可以单独编校任何先前的修订版。

如果您的用例要求文档保持活动状态,则首先使用 UPDATEFROM 语句来掩盖或删除要编校的字段。此过程将在以下部分中介绍。

编校修订版本中的特定字段

QLDB 不支持在文档修订版中编校特定字段。为此,您可以先使用UPDATE-REMOVEFROM-REMOVE语句从修订版中移除现有字段。例如,使用以下语句移除 VIN 为1HVBBAANXWH544237VehicleRegistration文档中的LicensePlateNumber字段。

UPDATE VehicleRegistration AS r REMOVE r.LicensePlateNumber WHERE r.VIN = '1HVBBAANXWH544237'

然后,如前所述,在删除之前编校之前的修订版。如果需要,您还可以单独编校包含此现已删除字段的任何先前修订版。

要了解如何优化查询,请继续 优化查询性能