对文档修订版执行编校 - 亚马逊 Quantum Ledger 数据库(亚马逊QLDB)

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

对文档修订版执行编校

重要

终止支持通知:现有客户可以在2025年7月31日终止支持QLDB之前使用亚马逊。有关更多详细信息,请参阅将亚马逊QLDB账本迁移到亚马逊 Aurora Postgr SQL e。

在 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`

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

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

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

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

'document-id'

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

检查编校是否已完成

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

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

编校示例

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

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 格式编写语句,但结果却以 Amazon Ion 格式QLDB返回。有关中 PartiQL 语法和语义的详细信息,请参阅QLDB。使用 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的VehicleRegistration文档1HVBBAANXWH544237

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

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

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

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

QLDB不支持在文档修订版中编辑特定字段。为此,可以先使用 UPDATE-REMOVE 或 FROM-REMOVE 语句从修订版中移除现有字段。例如,以下语句从VehicleRegistration文档中删除带有为VIN的LicensePlateNumber字段1HVBBAANXWH544237

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

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

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