

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

# 編輯文件修訂
<a name="working.redaction"></a>

**重要**  
支援終止通知：現有客戶將可以使用 Amazon QLDB，直到 07/31/2025 的支援結束為止。如需詳細資訊，請參閱[將 Amazon QLDB Ledger 遷移至 Amazon Aurora PostgreSQL](https://aws.amazon.com/blogs/database/migrate-an-amazon-qldb-ledger-to-amazon-aurora-postgresql/)。

在 Amazon QLDB 中，`DELETE`陳述式只會透過建立新的修訂，將其標示為已刪除，以邏輯方式刪除文件。QLDB 也支援*資料修訂*操作，可讓您永久刪除資料表歷史記錄中的非作用中文件修訂。

**注意**  
任何在 2021 年 7 月 22 日之前建立的分類帳目前不符合修訂資格。您可以在 Amazon QLDB 主控台上檢視分類帳的建立時間。

編輯操作只會刪除指定修訂中的使用者資料，並使日誌序列和文件中繼資料保持不變。這可維護您分類帳的整體資料完整性。

開始使用 QLDB 中的資料修訂之前，請務必在 *Amazon QLDB PartiQL 參考*[修訂考量和限制](ql-stored-procedures.redact_revision.md#ql-stored-procedures.redact_revision.considerations)中檢閱 。

**Topics**
+ [編輯預存程序](#working.redaction.stored-proc)
+ [檢查編輯是否完成](#working.redaction.check-completion)
+ [編輯範例](#working.redaction.example)
+ [刪除和編輯作用中修訂](#working.redaction.active-revision)
+ [在修訂中編輯特定欄位](#working.redaction.field)

## 編輯預存程序
<a name="working.redaction.stored-proc"></a>

您可以使用[REDACT\$1REVISION](ql-stored-procedures.redact_revision.md)預存程序永久刪除分類帳中的個別非作用中修訂。此預存程序會刪除索引儲存和日誌儲存中指定修訂中的所有使用者資料。不過，它會保留日誌序列和文件中繼資料，包括文件 ID 和雜湊，保持不變。*此操作不可復原。*

指定的文件修訂版本必須是歷史記錄中的非作用中修訂。文件的最新作用中修訂不符合修訂資格。

若要修訂多個修訂，您必須為每個修訂執行一次預存程序。您可以編輯每筆交易的一個修訂。

**語法**

```
EXEC REDACT_REVISION `block-address`, 'table-id', 'document-id'
```引數

`*block-address*`  
要修訂之文件修訂的日誌區塊位置。地址是具有兩個欄位的 Amazon Ion 結構： `strandId`和 `sequenceNo`。  
這是以反引號表示的 Ion 常值。例如：  

```
`{strandId:"JdxjkR9bSYB5jMHWcI464T", sequenceNo:17}`
```

'*table-id*'  
您想要修訂文件的資料表的唯一 ID，以單引號表示。

'*document-id*'  
要修訂修訂的唯一文件 ID，以單引號表示。

## 檢查編輯是否完成
<a name="working.redaction.check-completion"></a>

當您執行預存程序提交修訂請求時，QLDB 會以非同步方式處理資料修訂。完成後，修訂中的使用者資料 （由`data`結構表示） 會永久移除。若要檢查修訂請求是否已完成，您可以使用下列其中一項：
+ [日誌匯出](export-journal.md)
+ [日誌串流](streams.md)
+ [GetBlock API 操作](https://docs.aws.amazon.com/qldb/latest/developerguide/API_GetBlock.html)
+ [GetRevision API 操作](https://docs.aws.amazon.com/qldb/latest/developerguide/API_GetRevision.html)
+ [歷史記錄函數](working.history.md#working.history.function) – **注意：**在日誌中完成修訂後，可能需要一些時間，歷史記錄查詢才會顯示修訂的結果。當非同步修訂完成時，您可能會在其他修訂之前看到一些修訂，但歷史記錄查詢最終會顯示已完成的結果。

修訂修訂完成後，修訂的`data`結構會替換為新的`dataHash`欄位。此欄位的值是已移除`data`結構的 Ion 雜湊，如下列範例所示。因此，分類帳會維護其整體資料完整性，並透過現有的驗證 API 操作以密碼編譯方式進行驗證。若要進一步了解驗證，請參閱 [Amazon QLDB 中的資料驗證](verification.md)。

## 編輯範例
<a name="working.redaction.example"></a>

請考慮您之前在 中檢閱的車輛註冊文件[查詢修訂歷史記錄](working.history.md)。假設您想要修訂第二個修訂版 (`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`預存程序。然後，透過查詢[系統目錄](working.catalog.md)來尋找`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](ql-reference.query.md)。

有效的修訂請求會傳回 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"
    }
}
```

## 刪除和編輯作用中修訂
<a name="working.redaction.active-revision"></a>

作用中文件修訂 （亦即每個文件的最新未刪除修訂） 不符合資料修訂的資格。您必須先更新或刪除它，才能編輯作用中的修訂。這會將先前作用中的修訂移至歷史記錄，並使其符合修訂資格。

如果您的使用案例需要將整個文件標示為已刪除，則您首先會使用 [DELETE](ql-reference.delete.md) 陳述式。例如，下列陳述式會以邏輯方式刪除 VIN 為 `VehicleRegistration`的文件`1HVBBAANXWH544237`。

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

然後，在此刪除之前修訂先前的修訂，如前所述。如有需要，您也可以個別修訂任何先前的修訂。

如果您的使用案例需要文件保持作用中狀態，您首先會使用 [UPDATE](ql-reference.update.md) 或 [FROM](ql-reference.from.md) 陳述式來隱藏或移除您要編輯的欄位。此程序會在下節中說明。

## 在修訂中編輯特定欄位
<a name="working.redaction.field"></a>

QLDB 不支援修訂文件修訂中的特定欄位。若要這麼做，您可以先使用 [UPDATE-REMOVE](ql-reference.update.md) 或 [FROM-REMOVE](ql-reference.from.md) 陳述式，從修訂中移除現有欄位。例如，下列陳述式會從 VIN 為 `VehicleRegistration`的文件中移除 `LicensePlateNumber` 欄位`1HVBBAANXWH544237`。

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

然後，在此移除之前修訂先前的修訂版，如前所述。如有需要，您也可以個別修訂任何包含此現在移除欄位的先前修訂。

若要了解如何最佳化查詢，請繼續 [最佳化查詢效能](working.optimize.md)。