編輯文件修訂版本 - Amazon Quantum Ledger 資料庫 (Amazon QLDB)

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

編輯文件修訂版本

重要

支援結束通知:現有客戶將能夠使用 Amazon,QLDB直到 2025 年 7 月 31 日終止支援為止。有關更多詳細信息,請參閱將 Amazon QLDB 分類帳遷移到 Amazon Aurora 郵政. SQL

在 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'
引數
`block-address`

要編輯之文件修訂版本的分錄區塊位置。地址是具有兩個字段的 Amazon 離子結構:strandIdsequenceNo

這是由反引號表示的離子文字值。例如:

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

您要編輯其文件修訂版本之表格的唯一 ID,以單引號表示。

'document-id'

要編輯之修訂的唯一文件 ID,以單引號表示。

檢查密文是否完成

當您執行預存程序來提交密文要求時,會以非同步方式QLDB處理資料的密文。完成後,修訂版本中的使用者資料 (以結data構表示) 會永久移除。若要檢查密文請求是否已完成,您可以使用下列其中一項:

修訂版本密文完成後,版本修訂的data結構會被新dataHash欄位取代。此欄位的值是移除data結構的離子雜湊值,如下列範例所示。因此,總帳會維持其整體資料完整性,並透過現有的驗證作業保持可加密驗證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命令介面來查詢資料表 ID 或文件 ID (或任何字串常值) 時,傳回的值會以引號括住。不過,當您指定REDACT_REVISION預存程序的資料表 ID 和文件 ID 引數時,必須以單引號括住這些值。

這是因為您以 PartiQL 格式撰寫陳述式,但會以 Amazon Ion 格式QLDB傳回結果。如需有關中 PartiQL 語法和語意的詳細資訊QLDB,請參閱。使用 PartiQL 查詢離子

有效的密文請求會傳回代表您編輯的文件修訂版本的 Ion 結構,如下所示。

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

當您執行這個預存程序時,會以非同步方式QLDB處理密文要求。完成密文後,該data結構將被永久刪除並由新的替換 dataHash 欄位中傳回的子位置類型。此欄位的值是已移除data結構的離子雜湊值,如下所示。

注意

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 陳述式,從修訂中移除現有欄位。例如,下列陳述式會使用 for 從VehicleRegistration文件中移除LicensePlateNumber欄位1HVBBAANXWH544237。VIN

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

然後,如先前所述,在移除之前密文先前的修訂版。如果需要,您還可以單獨編輯包含此現在已刪除字段的任何先前修訂。

若要瞭解如何最佳化您的查詢,請繼續執行最佳化查詢效能