

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# ドキュメントのリビジョンを秘匿化する
<a name="working.redaction"></a>

**重要**  
サポート終了通知: 既存のお客様は、07/31/2025 のサポート終了まで Amazon QLDB を使用できます。詳細については、[「Amazon QLDB 台帳を 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 やハッシュなどのドキュメントメタデータは変更されません。この操作を元に戻すことはできません。

指定されたドキュメントリビジョンは、履歴上使用頻度の低いリビジョンでなければなりません。ドキュメントの最新の有効なリビジョンは、秘匿化の対象にはなりません。

複数のリビジョンを秘匿化するには、リビジョンごとに 1 回ストアドプロシージャを実行する必要があります。トランザクションごとに 1 つのリビジョンを秘匿化できます。

**[Syntax]** (構文)

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

`*block-address*`  
秘匿化されたドキュメントリビジョンのジャーナルブロックの場所。アドレスは、`strandId` と `sequenceNo` という 2 つのフィールドを含む Amazon Ion 構造です。  
これはバックスティックで示される 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)
+ [ゲットブロック API オペレーション](https://docs.aws.amazon.com/qldb/latest/developerguide/API_GetBlock.html)
+ [ゲットリビジョン 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)」で確認した車両登録書類を考えてみましょう。2 番目のリビジョン (`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"
    }
}
```

この値は `REDACT_REVISION` ストアドプロシージャに渡す必要があるため、クエリ結果の `blockAddress` に注意してください。次に、次のように[システムカタログ](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 シェルでテーブル 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 が `1HVBBAANXWH544237` の `VehicleRegistration` ドキュメントを論理的に削除します。

```
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 が `1HVBBAANXWH544237` の `LicensePlateNumber` フィールドを `VehicleRegistration` ドキュメントから削除します。

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

次に、前述のように、削除の前に以前のリビジョンを秘匿化します。必要であれば、この削除済みフィールドを含む以前のリビジョンを個別に秘匿化することもできます。

クエリを最適化する方法については、「[クエリパフォーマンスの最適化](working.optimize.md)」に進みます。