

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

# 使用資料表映射指定任務設定
<a name="CHAP_Tasks.CustomizingTasks.TableMapping"></a>

資料表映射使用數種類型的規則來指定資料來源、來源結構描述、資料及任何應在任務期間進行的轉換。您可以使用資料表映射指定資料庫中要遷移的個別資料表，以及要用於遷移的結構描述。

使用資料表映射時，您可以使用篩選條件來指定要從資料表欄複寫的資料。此外，您也可以使用轉換來修改選取的結構描述、資料表或檢視，然後再寫入目標資料庫。

**Topics**
+ [

# 從主控台指定資料表選取及轉換
](CHAP_Tasks.CustomizingTasks.TableMapping.Console.md)
+ [

# 使用 JSON 指定資料表選擇及轉換
](CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.md)
+ [

# 選取規則與動作
](CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Selections.md)
+ [

# 資料表映射中的萬用字元
](CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Wildcards.md)
+ [

# 轉換規則與動作
](CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Transformations.md)
+ [

# 使用轉換規則表達式定義資料行內容
](CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Expressions.md)
+ [

# 資料表和集合設定規則與操作
](CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Tablesettings.md)
+ [

# 使用資料遮罩來隱藏敏感資訊
](CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Masking.md)

**注意**  
使用 MongoDB 來源端點的資料表映射時，您可以使用篩選條件來指定要複寫的資料，並將 `schema_name` 取代為指定資料庫的名稱。或者，您可以使用預設值 `"%"`。

# 從主控台指定資料表選取及轉換
<a name="CHAP_Tasks.CustomizingTasks.TableMapping.Console"></a>

您可以使用 AWS 管理主控台 來執行資料表映射，包括指定資料表選擇和轉換。在主控台上，使用 **Where (何處)** 區段指定結構描述、資料表及動作 (包含或排除)。使用 **Filter (篩選條件)** 區段指定資料表中的資料行名稱，以及您希望套用到複寫任務的條件。兩者搭配使用，即可建立選取規則。

您可以在指定至少一個選取規則後，於資料表映射中包含轉換。您可以使用轉換來重新命名結構描述或資料表、將前綴或後綴新增到結構描述或資料表，或是移除資料表資料行。

**注意**  
AWS DMS 不支援每個結構描述層級、資料表層級或資料欄層級的多個轉換規則。

以下程序會示範如何在稱為 **EntertainmentAgencySample** 的結構描述中設定基於 **Customers** 資料表的選取規則。

**使用主控台指定資料表選取、篩選條件及轉換**

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/dms/v2/](https://console.aws.amazon.com/dms/v2/) 開啟 AWS DMS 主控台。

   如果您以 IAM 使用者身分登入，請確認您具備適當的許可來存取 AWS DMS。如需所需許可的詳細資訊，請參閱 [使用 所需的 IAM 許可 AWS DMS](security-iam.md#CHAP_Security.IAMPermissions)。

1. 在**儀表板**頁面上，選擇**資料庫遷移任務**。

1. 選擇 **Create Task (建立任務)**。

1. 在**任務組態**區段中輸入任務資訊，包括**任務識別碼**、**複寫執行個體**、**來源資料庫端點**、**目標資料庫端點**和**遷移類型**。  
![\[結構描述和資料表選取\]](http://docs.aws.amazon.com/zh_tw/dms/latest/userguide/images/datarep-create-task-20.png)

1. 在**資料表映射**區段中，輸入結構描述名稱和資料表名稱。在指定結構敘述名稱或資料表名稱時，您可以使用 "%" 作為萬用字元值。如需其他可使用的萬用字元資訊，請參閱：[資料表映射中的萬用字元](CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Wildcards.md)。指定要採取的動作，包含或排除篩選條件定義的資料。  
![\[結構描述和資料表選取\]](http://docs.aws.amazon.com/zh_tw/dms/latest/userguide/images/datarep-Tasks-selecttransfrm.png)

1. 使用 **Add column filter (新增資料行篩選條件)** 和 **Add condition (新增條件)** 連結指定篩選條件資訊。

   1. 選擇 **Add column filter (新增資料行篩選條件)** 來指定資料行和條件。

   1. 選擇 **Add condition (新增條件)** 來新增其他條件。

    以下範例顯示 **Customers** 資料表的篩選條件，該資料表包含介於 **01** 和 **85** 之間的 **AgencyIDs**。  
![\[結構描述和資料表選取\]](http://docs.aws.amazon.com/zh_tw/dms/latest/userguide/images/datarep-Tasks-filter.png)

1. 建立您希望的選取後，請選擇**新增選擇規則**。

1. 在您建立至少一個選取規則後，您便可以將轉換新增到任務。選擇 **add transformation rule (新增轉換規則)**。  
![\[轉換規則\]](http://docs.aws.amazon.com/zh_tw/dms/latest/userguide/images/datarep-Tasks-transform1.png)

1. 選擇您希望轉換的目標，並在請求時輸入其他資訊。以下範例會顯示一個轉換，從 **Customer** 資料表刪除 **AgencyStatus** 資料行。  
![\[轉換規則\]](http://docs.aws.amazon.com/zh_tw/dms/latest/userguide/images/datarep-Tasks-transform2.png)

1. 選擇 **Add transformation rule (新增轉換規則)**。

1. 選擇 **Create task (建立任務)**。

**注意**  
AWS DMS 不支援每個結構描述層級、資料表層級或資料欄層級的多個轉換規則。

# 使用 JSON 指定資料表選擇及轉換
<a name="CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation"></a>

您可以建立 JSON 檔案，來指定您希望在遷移期間套用的資料表映射。若您使用主控台建立遷移任務，您可以瀏覽此 JSON 檔案或將 JSON 直接輸入資料表映射方塊。如果您使用 CLI 或 API 來執行遷移，您可以使用 `CreateReplicationTask` 或 `ModifyReplicationTask` API 操作的 `TableMappings` 參數來指定此檔案。

AWS DMS 只能處理大小上限為 2 MB 的資料表映射 JSON 檔案。我們建議您在處理 DMS 任務時，將映射規則 JSON 檔案大小保持在 2 MB 以下。這麼做可防止任務建立或修改期間發生未預期的錯誤。當映射規則檔案超過 2 MB 的限制時，建議您將資料表分割為多個任務以減少映射規則檔案的大小，使其維持在此限制之下。

您可以指定您想要使用的資料表、檢視和結構描述。您也可以執行資料表、檢視和結構描述轉換，並指定 AWS DMS 如何載入個別資料表和檢視的設定。您可以使用以下規則類型，為這些選項建立資料表映射規則：
+ `selection` 規則 – 識別要載入的來源資料表、檢視和結構描述的類型和名稱。如需詳細資訊，請參閱[選取規則與動作](CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Selections.md)。
+ `transformation` 規則 – 在將特定來源資料表和結構描述載入目標之前，指定對來源資料表和結構描述的特定變更或新增。如需詳細資訊，請參閱[轉換規則與動作](CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Transformations.md)。

  此外，若要定義全新和現有的欄的內容，您可以在轉換規則內使用表達式。如需詳細資訊，請參閱[使用轉換規則表達式定義資料行內容](CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Expressions.md)。
+ `table-settings` 規則 – 指定 DMS 任務如何為個別資料表載入資料。如需詳細資訊，請參閱[資料表和集合設定規則與操作](CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Tablesettings.md)。

**注意**  
對於 Amazon S3 目標，您也可以使用 `post-processing` 規則類型和 `add-tag` 規則動作，以標記映射到所選資料表和結構描述的 S3 物件。如需詳細資訊，請參閱[Amazon S3 物件標記](CHAP_Target.S3.md#CHAP_Target.S3.Tagging)。  
針對下列目標，您可以使用 `object-mapping` 規則類型，指定所選結構描述和資料表的遷移方式和目標位置：  
Amazon DynamoDB – 如需詳細資訊，請參閱：[使用物件映射將資料遷移到 DynamoDB](CHAP_Target.DynamoDB.md#CHAP_Target.DynamoDB.ObjectMapping)。
Amazon Kinesis – 如需詳細資訊，請參閱：[使用物件映射將資料遷移到 Kinesis 資料串流](CHAP_Target.Kinesis.md#CHAP_Target.Kinesis.ObjectMapping)。
Apache Kafka – 如需詳細資訊，請參閱：[使用物件映射將資料遷移到 Kafka 主題](CHAP_Target.Kafka.md#CHAP_Target.Kafka.ObjectMapping)。

# 選取規則與動作
<a name="CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Selections"></a>

使用資料表映射，您可以透過選取規則及動作來指定您希望使用的資料表、檢視或結構描述。針對使用選取規則類型的資料表映射規則，可套用下列值。

**警告**  
請勿在這些規則中包含任何敏感資料。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/dms/latest/userguide/CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Selections.html)

**Example 遷移結構描述中的所有資料表**  
以下範例會從名為 `Test` 的結構描述，將您來源中的所有資料表遷移到目標端點。  

```
{
    "rules": [
        {
            "rule-type": "selection",
            "rule-id": "1",
            "rule-name": "1",
            "object-locator": {
                "schema-name": "Test",
                "table-name": "%"
            },
            "rule-action": "include"
        }
    ]
}
```

**Example 遷移結構描述中的部分資料表**  
以下範例會從名為 `Test` 的結構描述，將您來源中除了開頭為 `DMS` 之外的所有資料表遷移到目標端點。  

```
{
    "rules": [
        {
            "rule-type": "selection",
            "rule-id": "1",
            "rule-name": "1",
            "object-locator": {
                "schema-name": "Test",
                "table-name": "%"
            },
            "rule-action": "include"
        },
        {
            "rule-type": "selection",
            "rule-id": "2",
            "rule-name": "2",
            "object-locator": {
                "schema-name": "Test",
                "table-name": "DMS%"
            },
            "rule-action": "exclude"
        }
    ]
}
```

**Example 遷移單一結構描述中指定的單一資料表**  
以下範例從來源中的 `NewCust` 結構描述將 `Customer` 資料表遷移到目標端點。  

```
{
    "rules": [
        {
            "rule-type": "selection",
            "rule-id": "1",
            "rule-name": "1",
            "object-locator": {
                "schema-name": "NewCust",
                "table-name": "Customer"
            },
            "rule-action": "explicit"
        }
    ]
}
```
您可以指定多個選擇規則，在多個資料表和結構描述上明確地選取。

**Example 以設定的順序遷移資料表**  
資料表和檢視會根據其負載順序值進行遷移，而較高值會在遷移序列中接收優先順序。下列範例會遷移兩個資料表，優先順序值`loadfirst`為 2，`loadsecond`優先順序值為 1，遷移任務會先處理`loadfirst`資料表，再繼續處理`loadsecond`資料表。此優先順序機制可確保在遷移過程中遵守資料庫物件之間的相依性。  

```
{
    "rules": [
        {
            "rule-type": "selection",
            "rule-id": "1",
            "rule-name": "1",
            "object-locator": {
                "schema-name": "Test",
                "table-name": "loadsecond"
            },
            "rule-action": "include",
            "load-order": "1"
        },
        {
            "rule-type": "selection",
            "rule-id": "2",
            "rule-name": "2",
            "object-locator": {
                "schema-name": "Test",
                "table-name": "loadfirst"
            },
            "rule-action": "include",
            "load-order": "2"
        }
    ]
}
```

**注意**  
`load-order` 適用於資料表初始化。如果 `MaxFullLoadSubTasks` 大於 1，則連續資料表的載入不會等待先前的資料表載入完成。

**Example 遷移結構描述中的部分檢視**  
以下範例會從名為 `Test` 的結構描述，將您來源中的一些檢視遷移至目標中的對等資料表。  

```
{
   "rules": [
        {
           "rule-type": "selection",
           "rule-id": "2",
           "rule-name": "2",
           "object-locator": {
               "schema-name": "Test",
               "table-name": "view_DMS%",
               "table-type": "view"
            },
           "rule-action": "include"
        }
    ]
}
```

**Example 遷移結構描述中的所有資料表和檢視**  
以下範例會從名為 `report` 的結構描述，將您來源中的所有資料表和檢視遷移至目標中的對等資料表。  

```
{
   "rules": [
        {
           "rule-type": "selection",
           "rule-id": "3",
           "rule-name": "3",
           "object-locator": {
               "schema-name": "report",
               "table-name": "%",
               "table-type": "all"
            },
           "rule-action": "include"
        }
    ]
}
```

# 資料表映射中的萬用字元
<a name="CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Wildcards"></a>

本節說明在為資料表映射指定結構描述和資料表名稱時，可使用的萬用字元。


| 萬用字元 | 相符 | 
| --- |--- |
| % | Zero or more characters | 
| \$1 | A single character | 
| [\$1] | A literal underscore character | 
| [ab] | A set of characters. For example, [ab] matches either 'a' or 'b'. | 
| [a-d] | A range of characters. For example,[a-d] matches either 'a', 'b', 'c', or 'd'. | 

對於 Oracle 來源和目標端點，您可以使用額外的連線屬性 `escapeCharacter` 來指定逸出字元。逸出字元可讓您在運算式中使用指定的萬用字元，且不產生萬用字元效果。例如，`escapeCharacter=#` 可讓您使用 '\$1' 在運算式中將萬用字元當作一般字元，如同在此範例程式碼中一樣。

```
{
    "rules": [
        {
            "rule-type": "selection",
            "rule-id": "542485267",
            "rule-name": "542485267",
            "object-locator": { "schema-name": "ROOT", "table-name": "TEST#_T%" },
            "rule-action": "include",
            "filters": []
        }
    ]
}
```

在這裡，'\$1' 逸出字元可讓 '\$1' 萬用字元充當一般字元。 AWS DMS 會在名為 的結構描述中選取資料表`ROOT`，其中每個資料表的名稱都有 `TEST_T`做為其字首。

# 轉換規則與動作
<a name="CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Transformations"></a>

您可以使用轉換動作指定您希望套用到所選取結構描述或資料表的任何轉換。轉換規則為選擇性。

## 限制
<a name="CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Transformations.Limitations"></a>
+ 您無法對相同物件 （結構描述、資料表、資料欄、資料表空間或索引資料表空間） 套用多個轉換規則動作。但只要每個轉換動作都套用至不同的物件，您就可以在任意層級上套用數個轉換規則動作。不過，此限制不適用於使用資料遮罩轉換規則時，您可以在其中`CHANGE-DATA-TYPE`對相同資料欄進行其他轉換，例如 `ADD-COLUMN`或 。
+ 轉換規則中的資料表名稱和資料欄名稱會區分大小寫。例如，您必須以大寫提供 Oracle 或 Db2 資料庫的資料表名稱和資料欄名稱。
+ 使用由右至左語言的資料欄名稱不支援轉換。
+ 名稱中包含特殊字元 (例如 ＃，\$1，/，-) 的資料欄無法執行轉換。
+ 對於映射至 BLOB/CLOB 資料類型的資料欄，唯一支援的轉換方式是將資料欄放置在目標上。
+ AWS DMS 不支援將兩個來源資料表複寫至單一目標資料表。 會根據複寫任務的轉換規則，將記錄從資料表複 AWS DMS 寫至資料表，以及從資料欄複寫至資料欄。物件名稱必須是唯一名稱以防止重疊。

  例如，來源資料表有一個名為 `ID` 的資料欄，而映射目標資料表已存在名為 `id` 的資料欄。如果規則使用 `ADD-COLUMN` 陳述式新增名為 `id` 的新資料欄，並使用 SQLite 陳述式將自訂值填入資料欄，則會建立名為 `id` 的重複、不明確物件，且不受支援。
+ 建立轉換規則時，建議您只在選取規則指定多個資料欄時使用 `data-type` 參數，例如，當您將 `column-name`設定為 時`%`。我們不建議使用 `data-type` 來選取單一資料欄。
+ AWS DMS 不支援來源和目標物件 （資料表） 位於相同資料庫/結構描述上的轉換規則。在轉換規則中使用與來源和目標相同的資料表可能會導致非預期且可能有害的結果，包括但不限於資料表資料的意外變更、資料表結構的修改，甚至是資料表遭到捨棄。

## 值
<a name="CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Transformations.Values"></a>

針對使用轉換規則類型的資料表映射規則，可套用下列值。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/dms/latest/userguide/CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Transformations.html)

## 範例
<a name="CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Transformations.Examples"></a>

**Example 重新命名結構描述**  
以下範例會將您來源中的結構描述，從 `Test` 重新命名為目標中的 `Test1`。  

```
{

    "rules": [
        {
            "rule-type": "selection",
            "rule-id": "1",
            "rule-name": "1",
            "object-locator": {
                "schema-name": "Test",
                "table-name": "%"
            },
            "rule-action": "include"
        },
        {
            "rule-type": "transformation",
            "rule-id": "2",
            "rule-name": "2",
            "rule-action": "rename",
            "rule-target": "schema",
            "object-locator": {
                "schema-name": "Test"
            },
            "value": "Test1"
        }
    ]
}
```

**Example 重新命名資料表**  
以下範例會將您來源中的資料表，從 `Actor` 重新命名為目標中的 `Actor1`。  

```
{
    "rules": [
        {
            "rule-type": "selection",
            "rule-id": "1",
            "rule-name": "1",
            "object-locator": {
                "schema-name": "Test",
                "table-name": "%"
            },
            "rule-action": "include"
        },
        {
            "rule-type": "transformation",
            "rule-id": "2",
            "rule-name": "2",
            "rule-action": "rename",
            "rule-target": "table",
            "object-locator": {
                "schema-name": "Test",
                "table-name": "Actor"
            },
            "value": "Actor1"
        }
    ]
}
```

**Example 重新命名欄位**  
以下範例會將您來源中 `Actor` 資料表內的資料行，從 `first_name` 重新命名為目標中的 `fname`。  

```
{
    "rules": [
        {
            "rule-type": "selection",
            "rule-id": "1",
            "rule-name": "1",
            "object-locator": {
                "schema-name": "test",
                "table-name": "%"
            },
            "rule-action": "include"
        },
         {
            "rule-type": "transformation",
            "rule-id": "4",
            "rule-name": "4",
            "rule-action": "rename",
            "rule-target": "column",
            "object-locator": {
                "schema-name": "test",
                "table-name": "Actor",
                "column-name" : "first_name"
            },
            "value": "fname"
        }
    ]
}
```

**Example 重新命名 Oracle 資料表資料表空間**  
以下範例針對 Oracle 來源中名為 `Actor` 的資料表，將名為 `SetSpace` 的資料表之資料表空間重新命名為 Oracle 目標端點中的 `SceneTblSpace`。  

```
{
    "rules": [
        {
            "rule-type": "selection",
            "rule-id": "1",
            "rule-name": "1",
            "object-locator": {
                "schema-name": "Play",
                "table-name": "%"
            },
            "rule-action": "include"
        },
        {
            "rule-type": "transformation",
            "rule-id": "2",
            "rule-name": "2",
            "rule-action": "rename",
            "rule-target": "table-tablespace",
            "object-locator": {
                "schema-name": "Play",
                "table-name": "Actor",
                "table-tablespace-name": "SetSpace"
            },
            "value": "SceneTblSpace"
        }
    ]
}
```

**Example 重新命名 Oracle 索引資料表空間**  
以下範例針對 Oracle 來源中名為 `Actor` 的資料表，將名為 `SetISpace` 的索引資料表空間重新命名為 Oracle 目標端點中的 `SceneIdxSpace`。  

```
{
    "rules": [
        {
            "rule-type": "selection",
            "rule-id": "1",
            "rule-name": "1",
            "object-locator": {
                "schema-name": "Play",
                "table-name": "%"
            },
            "rule-action": "include"
        },
        {
            "rule-type": "transformation",
            "rule-id": "2",
            "rule-name": "2",
            "rule-action": "rename",
            "rule-target": "table-tablespace",
            "object-locator": {
                "schema-name": "Play",
                "table-name": "Actor",
                "table-tablespace-name": "SetISpace"
            },
            "value": "SceneIdxSpace"
        }
    ]
}
```

**Example 新增資料行**  
下列範例會將 `datetime` 欄新增至結構描述 `test` 中的資料表 `Actor`。  

```
{
    "rules": [
        {
            "rule-type": "selection",
            "rule-id": "1",
            "rule-name": "1",
            "object-locator": {
                "schema-name": "test",
                "table-name": "%"
            },
            "rule-action": "include"
        },
        {
            "rule-type": "transformation",
            "rule-id": "2",
            "rule-name": "2",
            "rule-action": "add-column",
            "rule-target": "column",
            "object-locator": {
                "schema-name": "test",
                "table-name": "actor"
            },
            "value": "last_updated",
            "data-type": {
                "type": "datetime",
                "precision": 6
            }
        }
    ]
}
```

**Example 移除資料行**  
以下範例會轉換您來源中名為 `Actor` 的資料表，在您的目標中移除所有開頭為 `col` 字元的資料行。  

```
{
 	"rules": [{
		"rule-type": "selection",
		"rule-id": "1",
		"rule-name": "1",
		"object-locator": {
			"schema-name": "test",
			"table-name": "%"
		},
		"rule-action": "include"
	}, {
		"rule-type": "transformation",
		"rule-id": "2",
		"rule-name": "2",
		"rule-action": "remove-column",
		"rule-target": "column",
		"object-locator": {
			"schema-name": "test",
			"table-name": "Actor",
			"column-name": "col%"
		}
	}]
 }
```

**Example 轉換成小寫**  
以下範例會將資料表名稱從來源中的 `ACTOR` 轉換為目標中的 `actor`。  

```
{
	"rules": [{
		"rule-type": "selection",
		"rule-id": "1",
		"rule-name": "1",
		"object-locator": {
			"schema-name": "test",
			"table-name": "%"
		},
		"rule-action": "include"
	}, {
		"rule-type": "transformation",
		"rule-id": "2",
		"rule-name": "2",
		"rule-action": "convert-lowercase",
		"rule-target": "table",
		"object-locator": {
			"schema-name": "test",
			"table-name": "ACTOR"
		}
	}]
}
```

**Example 轉換成大寫**  
以下範例會將您來源中所有資料表及結構描述中的所有資料行，從小寫轉換為目標中的大寫。  

```
{
    "rules": [
        {
            "rule-type": "selection",
            "rule-id": "1",
            "rule-name": "1",
            "object-locator": {
                "schema-name": "test",
                "table-name": "%"
            },
            "rule-action": "include"
        },
        {
            "rule-type": "transformation",
            "rule-id": "2",
            "rule-name": "2",
            "rule-action": "convert-uppercase",
            "rule-target": "column",
            "object-locator": {
                "schema-name": "%",
                "table-name": "%",
                "column-name": "%"
            }
        }
    ]
}
```

**Example 新增前綴**  
以下範例會轉換您來源中所有的資料表，在目標中新增前綴 `DMS_`。  

```
{
 	"rules": [{
		"rule-type": "selection",
		"rule-id": "1",
		"rule-name": "1",
		"object-locator": {
			"schema-name": "test",
			"table-name": "%"
		},
		"rule-action": "include"
	}, {
		"rule-type": "transformation",
		"rule-id": "2",
		"rule-name": "2",
		"rule-action": "add-prefix",
		"rule-target": "table",
		"object-locator": {
			"schema-name": "test",
			"table-name": "%"
		},
		"value": "DMS_"
	}]
 
}
```

**Example 取代前綴**  
以下範例會轉換您來源中所有包含前綴 `Pre_` 的資料行，在目標中將其取代成 `NewPre_`。  

```
{
    "rules": [
        {
            "rule-type": "selection",
            "rule-id": "1",
            "rule-name": "1",
            "object-locator": {
                "schema-name": "test",
                "table-name": "%"
            },
            "rule-action": "include"
        },
        {
            "rule-type": "transformation",
            "rule-id": "2",
            "rule-name": "2",
            "rule-action": "replace-prefix",
            "rule-target": "column",
            "object-locator": {
                "schema-name": "%",
                "table-name": "%",
                "column-name": "%"
            },
            "value": "NewPre_",
            "old-value": "Pre_"
        }
    ]
}
```

**Example 移除後綴**  
以下範例會轉換您來源中所有的資料表，在目標中移除後綴 `_DMS`。  

```
{
	"rules": [{
		"rule-type": "selection",
		"rule-id": "1",
		"rule-name": "1",
		"object-locator": {
			"schema-name": "test",
			"table-name": "%"
		},
		"rule-action": "include"
	}, {
		"rule-type": "transformation",
		"rule-id": "2",
		"rule-name": "2",
		"rule-action": "remove-suffix",
		"rule-target": "table",
		"object-locator": {
			"schema-name": "test",
			"table-name": "%"
		},
		"value": "_DMS"
	}]
}
```

**Example 定義主索引鍵**  
以下範例在遷移到目標端點的 `ITEM` 資料表的三個欄上，定義名為 `ITEM-primary-key` 的主索引鍵。  

```
{
	"rules": [{
		"rule-type": "selection",
		"rule-id": "1",
		"rule-name": "1",
		"object-locator": {
			"schema-name": "inventory",
			"table-name": "%"
		},
		"rule-action": "include"
	}, {
		"rule-type": "transformation",
		"rule-id": "2",
		"rule-name": "2",
		"rule-action": "define-primary-key",
		"rule-target": "table",
		"object-locator": {
			"schema-name": "inventory",
			"table-name": "ITEM"
		},
		"primary-key-def": {
			"name": "ITEM-primary-key",
			"columns": [
				"ITEM-NAME",
				"BOM-MODEL-NUM",
				"BOM-PART-NUM"
			]
              }
	}]
}
```

**Example 定義唯一索引**  
以下範例在遷移到目標端點的 `ITEM` 資料表的三個欄上，定義名為 `ITEM-unique-idx` 的唯一索引。  

```
{
	"rules": [{
		"rule-type": "selection",
		"rule-id": "1",
		"rule-name": "1",
		"object-locator": {
			"schema-name": "inventory",
			"table-name": "%"
		},
		"rule-action": "include"
	}, {
		"rule-type": "transformation",
		"rule-id": "2",
		"rule-name": "2",
		"rule-action": "define-primary-key",
		"rule-target": "table",
		"object-locator": {
			"schema-name": "inventory",
			"table-name": "ITEM"
		},
		"primary-key-def": {
			"name": "ITEM-unique-idx",
			"origin": "unique-index",
			"columns": [
				"ITEM-NAME",
				"BOM-MODEL-NUM",
				"BOM-PART-NUM"
			]
              }
	}]
}
```

**Example 變更目標資料行的資料類型**  
下列範例會將名為 `SALE_AMOUNT` 之目標資料行的資料類型，從現有的資料類型變更為 `int8`。  

```
{
    "rule-type": "transformation",
    "rule-id": "1",
    "rule-name": "RuleName 1",
    "rule-action": "change-data-type",
    "rule-target": "column",
    "object-locator": {
        "schema-name": "dbo",
        "table-name": "dms",
        "column-name": "SALE_AMOUNT"
    },
    "data-type": {
        "type": "int8"
    }
}
```

**Example 新增前映像資料行**  
針對名為 `emp_no` 的來源欄，下列範例中的轉換規則會在目標中新增名為 `BI_emp_no` 的新欄。  

```
{
	"rules": [{
			"rule-type": "selection",
			"rule-id": "1",
			"rule-name": "1",
			"object-locator": {
				"schema-name": "%",
				"table-name": "%"
			},
			"rule-action": "include"
		},
		{
			"rule-type": "transformation",
			"rule-id": "2",
			"rule-name": "2",
			"rule-target": "column",
			"object-locator": {
				"schema-name": "%",
				"table-name": "employees"
			},
			"rule-action": "add-before-image-columns",
			"before-image-def": {
				"column-prefix": "BI_",
				"column-suffix": "",
				"column-filter": "pk-only"
			}
		}
	]
}
```
在此，下列陳述式會在對應的資料列中為 `BI_emp_no` 欄填入 1。  

```
UPDATE employees SET emp_no = 3 WHERE BI_emp_no = 1;
```
將 CDC 更新寫入支援 AWS DMS 的目標時，資料`BI_emp_no`欄可讓您知道`emp_no`資料欄中哪些資料列具有更新的值。

# 使用轉換規則表達式定義資料行內容
<a name="CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Expressions"></a>

若要定義全新和現有的欄的內容，您可以在轉換規則內使用表達式。例如，您可以使用表達式來新增欄或將來源資料表標頭複寫至目標。您也可以使用表達式在來源進行插入、更新或刪除的同時，為目標資料表上的記錄加上旗標。

**Topics**
+ [

## 使用表達式新增資料行
](#CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Expressions-adding)
+ [

## 使用表達式為目標記錄加上旗標
](#CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Expressions-Flagging)
+ [

## 使用表達式複寫來源資料表標頭
](#CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Expressions-Headers)
+ [

## 使用 SQLite 函數來建構表達式
](#CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Expressions-SQLite)
+ [

## 使用表達式將中繼資料新增至目標資料表
](#CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Expressions-Metadata)

## 使用表達式新增資料行
<a name="CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Expressions-adding"></a>

若要在轉換規則中使用表達式將欄新增至資料表，請使用 `add-column` 規則動作和 `column` 規則目標。

下列範例會將新的欄新增至 `ITEM` 資料表。它會將新的欄名稱設為具有 `string` 資料類型且長度為 50 個字元的 `FULL_NAME`。表達式會串連兩個現有的欄 (`FIRST_NAME` 和 `LAST_NAME`) 的值，以得出 `FULL_NAME`。`schema-name`、`table-name` 和表達式參數是指來源資料庫資料表中的物件。`Value` 和 `data-type` 區塊是指目標資料庫資料表中的物件。

```
{
    "rules": [
        {
            "rule-type": "selection", 
            "rule-id": "1",
            "rule-name": "1",
            "object-locator": {
                "schema-name": "Test",
                "table-name": "%"
            },
            "rule-action": "include"
        },
        {
            "rule-type": "transformation",
            "rule-id": "2",
            "rule-name": "2",
            "rule-action": "add-column",
            "rule-target": "column",
            "object-locator": {
                "schema-name": "Test",
                "table-name": "ITEM"
            },
            "value": "FULL_NAME",
            "expression": "$FIRST_NAME||'_'||$LAST_NAME",
            "data-type": {
                 "type": "string",
                 "length": 50
            }
        }
    ]
}
```

## 使用表達式為目標記錄加上旗標
<a name="CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Expressions-Flagging"></a>

若要在來源資料表中進行插入、更新或刪除的同時，為目標資料表中的記錄加上旗標，請在轉換規則中使用表達式。表達式會使用 `operation_indicator` 函數來為記錄加上旗標。從來源刪除的記錄不會從目標中刪除。相反地，目標記錄會加上使用者提供的值的旗標，表示它已從來源中刪除。

**注意**  
`operation_indicator` 函數僅適用於在來源和目標資料庫都具有主索引鍵的資料表。

例如，下列轉換規則會先將新的 `Operation` 欄新增至目標資料表。接著，無論何時從來源資料表中刪除記錄，它都會以 `D` 值更新欄。

```
{
      "rule-type": "transformation",
      "rule-id": "2",
      "rule-name": "2",
      "rule-target": "column",
      "object-locator": {
        "schema-name": "%",
        "table-name": "%"
      },
      "rule-action": "add-column",
      "value": "Operation",
      "expression": "operation_indicator('D', 'U', 'I')",
      "data-type": {
        "type": "string",
        "length": 50
      }
}
```

## 使用表達式複寫來源資料表標頭
<a name="CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Expressions-Headers"></a>

根據預設，來源資料表的標頭不會複寫至目標。若要指出要複寫哪些標頭，請使用轉換規則搭配包含資料表欄標頭的表達式。

您可以在表達式中使用下列欄標頭。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/dms/latest/userguide/CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Expressions.html)

下列範例會使用來源中的串流位置值，將新的欄新增至目標。若為 SQL Server，串流位置值為來源端點的 LSN。若為 Oracle，串流位置值為來源端點的 SCN。

```
{
      "rule-type": "transformation",
     "rule-id": "2",
      "rule-name": "2",
      "rule-target": "column",
      "object-locator": {
        "schema-name": "%",
        "table-name": "%"
      },
      "rule-action": "add-column",
      "value": "transact_id",
      "expression": "$AR_H_STREAM_POSITION",
      "data-type": {
        "type": "string",
        "length": 50
      }
    }
```

下列範例會將新資料欄新增至目標，並具有來源的唯一遞增數字。此值代表工作層級的 35 位數唯一編號。前 16 位數字是時間戳記的一部分，後 19 位數是依 DBMS 遞增的 record\$1id 編號。

```
{
"rule-type": "transformation",
"rule-id": "2",
"rule-name": "2",
"rule-target": "column",
"object-locator": {
"schema-name": "%",
"table-name": "%"
},
"rule-action": "add-column",
"value": "transact_id",
"expression": "$AR_H_CHANGE_SEQ",
"data-type": {
"type": "string",
"length": 50
}
}
```

## 使用 SQLite 函數來建構表達式
<a name="CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Expressions-SQLite"></a>

您可以使用資料表設定指定任何您希望套用到特定操作所選取資料表或檢視的任何設定。資料表設定規則是選用的。

**注意**  
MongoDB 和 DocumentDB 資料庫不使用資料表和檢視的概念，而是將資料記錄儲存為文件，並集中在*集合*內。因此，從 MongoDB 或 DocumentDB 來源遷移時，請考慮所選*集合*平行載入設定的範圍分割類型，而不是資料表和檢視 。

**Topics**
+ [

### 使用 CASE 表達式
](#CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Expressions-SQLite.CASE)
+ [

### 範例
](#CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Expressions-SQLite.Ex)

接下來將展示您可用於建立轉換規則運算式的字串函數。


| 字串函數 | Description | 
| --- | --- | 
|  `lower(x)`  |  `lower(x)` 函數會傳回 *`x`* 字串的副本，並所有字元轉換為小寫。依預設，內建 `lower` 函數僅適用於 ASCII 字元。  | 
|  `upper(x)`  |  `upper(x)` 函數會傳回字串 *`x`* 的副本，並將所有字元轉換為大寫。依預設，內建 `upper` 函數僅適用於 ASCII 字元。  | 
|  `ltrim(x,y)`  |  `ltrim(x,y)` 函數會傳回從 x 左側刪除 y 中所有字元形成的字串。如果 y 沒有值，則 `ltrim(x)` 會移除 x 左側的空格。  | 
|  `replace(x,y,z)`  |  `replace(x,y,z)` 函數會傳回將字串 x 中每次出現的字串 y 替換為字串 z 所形成的字串。  | 
| `rtrim(x,y)` |  `rtrim(x,y)` 函數會傳回從 x 右側刪除 y 中出現的所有字元所形成的字串。如果 y 沒有值，則 `rtrim(x)` 會移除 x 右側的空格。  | 
| `substr(x,y,z)` |  `substr(x,y,z)` 函數會傳回輸入字串 `x` 以第 `y` 個字元開頭的子字串，該字串長度為 *`z`* 個字元。 如果省略 *`z`*，則 `substr(x,y)` 會傳回從字串 `y` 第 `x` 個字元到結尾的所有字元。`x` 最左邊的字元是數字 1。如果 *`y`* 是負數，則建立子字串時第一個字元會從右邊開始計算，而不是左邊。如果 *`z`* 是負數，則傳回 `y` 的前 `abs(z)` 個字元。如果 `x` 是字串，那麼字元的索引是指實際的 UTF-8 字元。如果 `x` 是 BLOB，那麼索引是指位元組。  | 
| trim(x,y) |  `trim(x,y)` 函數會傳回從 `y` 兩側刪除所有 `x` 中所含字元的字串。如果 `y` 沒有值，則 `trim(x)` 會移除 `x` 兩側的空格。  | 

接下來將展示您可用於建立轉換規則運算式的 LOB 函數。


| LOB 函數 | Description | 
| --- | --- | 
|  `hex(x)`  |  `hex` 函數會接收 BLOB 做為引數，並傳回 BLOB 內容的大寫十六進位字串版本。  | 
|  `randomblob (N)`  |  `randomblob(N)` 函數會傳回一個包含偽隨機字節的 `N` 位元組 BLOB。如果 *N* 小於 1，則傳回一個 1 位元組的隨機 BLOB。  | 
|  `zeroblob(N)`  |  `zeroblob(N)` 函數會傳回一個由 `N` 位元組 0x00 組成的 BLOB。  | 

接下來將展示您可用於建立轉換規則運算式的數值函數。


| 數值函數 | Description | 
| --- | --- | 
|  `abs(x)`  |  `abs(x)` 函數會傳回數值引數 `x` 的絕對值。如果 *x* 為 NULL，`abs(x)` 函數會傳回 NULL。如果 **x** 是無法轉換為數值的字串或 BLOB，則 `abs(x)` 函數會傳回 0.0。  | 
|  `random()`  |  `random` 函數會傳回介於 -9,223,372,036,854,775,808 到 \$19,223,372,036,854,775,807 之間的偽隨機整數。  | 
|  `round (x,y)`  |  `round (x,y)` 函數會傳回一個四捨五入到小數點右側 *y* 位的浮點值 *x*。如果 *y* 沒有值，則假定為 0。  | 
|  `max (x,y...)`  |  多參數 `max` 函數會傳回具有最大值的參數，或在任意參數為 NULL 時傳回 NULL。 `max` 函數會從左到右搜尋其參數，以尋找定義整理函數的參數。如果找到符合項目，函數將使用該整理函數進行所有字串的比較。如果 `max` 沒有定義整理函數的引數，則會使用 `BINARY` 整理函數。`max` 函數有兩個或以上的參數時為簡單函數，但如果只有一個參數，則會作為彙整函數執行。  | 
|  `min (x,y...)`  |  多參數 `min` 函數會傳回具有最小值的參數。 `min` 函數會從左到右搜尋其參數，以尋找定義整理函數的參數。如果找到符合項目，函數將使用該整理函數進行所有字串的比較。如果 `min` 沒有定義整理函數的引數，則會使用 `BINARY` 整理函數。`min` 函數有兩個或以上的參數時為簡單函數，但如果只有一個參數，則會作為彙整函數執行。  | 

接下來，您可以找到可用來建立轉換規則表達式的 NULL 檢查函數。


| NULL 檢查函數 | Description | 
| --- | --- | 
|  `coalesce (x,y...)`  |  `coalesce` 函數會傳回其第一個非 NULL 參數的副本，但如果所有參數都為 NULL，則傳回 NULL。coalesce 函數至少有兩個引數。  | 
|  `ifnull(x,y)`  |  `ifnull` 函數會傳回其第一個非 NULL 參數的副本，但如果兩個參數都為 NULL，則傳回 NULL。`ifnull` 函數只有兩個參數。`ifnull` 函數與具有兩個參數的 `coalesce` 相同。  | 
|  `nullif(x,y)`  |  如果參數不同，`nullif(x,y)` 函數會傳回其第一個參數的副本，但如果參數相同，則傳回 NULL。 `nullif(x,y)` 函數會從左到右搜尋其參數，以尋找定義整理函數的參數。如果找到符合項目，函數將使用該整理函數進行所有字串的比較。如果 nullif 的參數都未定義整理函數，則會使用 `BINARY` 整理函數。  | 

接下來，您可以找到可用來建立轉換規則表達式的日期和時間函數。


| 日期和時間函數 | Description | 
| --- | --- | 
|  `date(timestring, modifier, modifier...)`  |  `date` 函數會傳回 YYYY-MM-DD 格式的日期。  | 
|  `time(timestring, modifier, modifier...)`  |  `time` 函數會傳回 HH:MM:SS 格式的時間。  | 
|  `datetime(timestring, modifier, modifier...)`  |  `datetime` 函數會傳回 YYYY-MM-DD HH:MM:SS 格式的日期和時間。  | 
|  `julianday(timestring, modifier, modifier...)`  |  `julianday` 函數會傳回自西元前 4714 年 11 月 24 日格林威治中午以來的天數。  | 
|  `strftime(format, timestring, modifier, modifier...)`  |  `strftime` 函數會使用下列其中一個變數，根據指定為第一個引數的格式字串傳回日期： `%d`：月曆日 `%H`：小時 00–24 `%f`：\$1\$1 小數秒 SS.SSS `%j`：年的第幾日 001–366 `%J`：\$1\$1 儒略日數 `%m`：月份 01–12 `%M`：分鐘 00–59 `%s`：自 1970-01-01 起的秒數 `%S`：秒 00–59 `%w`：星期幾 0–6 星期日==0 `%W`: 年的第幾週 00–53 `%Y`: 年份 0000–9999 `%%`: %  | 

接下來將展示您可用於建立轉換規則運算式的雜湊函數。


| 雜湊函數 | Description | 
| --- | --- | 
|  `hash_sha256(x)`  |  `hash` 函數會產生輸入資料欄的雜湊值 (使用 SHA-256 演算法)，並傳回所產生雜湊值的十六進位值。 若要在表示式中使用 `hash` 函數，請將 `hash_sha256(x)` 新增至表達式，並以來源欄名稱取代 *`x`*。  | 

### 使用 CASE 表達式
<a name="CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Expressions-SQLite.CASE"></a>

SQLite `CASE` 表達式會評估條件清單，並根據結果傳回表達式。語法如下所示：

```
    CASE case_expression
     WHEN when_expression_1 THEN result_1
     WHEN when_expression_2 THEN result_2
     ...
     [ ELSE result_else ] 
    END

# Or 

     CASE
     WHEN case_expression THEN result_1
     WHEN case_expression THEN result_2
     ...
     [ ELSE result_else ] 
    END
```

### 範例
<a name="CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Expressions-SQLite.Ex"></a>

**Example 使用 case 條件將新的字串欄新增到目標資料表**  
例如，下列範例轉換規則會先將新的字串欄 `emp_seniority` 新增至目標資料表 `employee`。它會使用薪資欄上的 SQLite `round` 函數，透過 case 條件來檢查薪資是否等於或超過 20,000。如果是，則該資料欄會取得值 `SENIOR`，而其他情況的值為 `JUNIOR`。  

```
  {
      "rule-type": "transformation",
      "rule-id": "2",
      "rule-name": "2",
      "rule-action": "add-column",
      "rule-target": "column",
      "object-locator": {
        "schema-name": "public",
        "table-name": "employee"
      },
      "value": "emp_seniority",
      "expression": " CASE WHEN round($emp_salary)>=20000 THEN ‘SENIOR’ ELSE ‘JUNIOR’ END",
      "data-type": {
        "type": "string",
        "length": 50
      }

  }
```

**Example 使用 SUBSTR 函數將新的字串資料欄新增至目標資料表**  
下列範例轉換規則會使用 SQLite 運算子或函數來新增字串欄，以定義欄中的資料。此方法涉及使用 SQLite 函數，將從 Oracle 載入的 GUID 資料轉換為 UUID 格式，然後再將其插入 Postgresql 目標資料表。  
下列規則使用 SQLite 子字串 (SUBSTR)、十六進位函數 (HEX) 和小寫 (LOWER) 函數，將 GUID 資料分成數個以連字號分隔的群組，特別是 8 位數的群組，後面接著 4 位數的群組，後面接著 12 位數的群組，總共 32 位數，代表 128 位元。  
以下是透過轉換規則進行目標後處理時的範例來源資料和輸出：  
**來源資料表 (Oracle GUID 格式）**    
T\$1COL2  

```
06F6949D234911EE80670242AC120002
1A2B3C4D5E6F11EE80670242AC120003
F5E4D3C2B1A011EE80670242AC120004
```
**目標資料表 (PostgreSQL UUID 格式）**    
T\$1COL2\$1TMP  

```
06f6949d-2349-11ee-8067-0242ac120002
1a2b3c4d-5e6f-11ee-8067-0242ac120003
f5e4d3c2-b1a0-11ee-8067-0242ac120004
```

```
{
  "rule-type": "transformation",
  "rule-id": "2",
  "rule-name": "2",
  "rule-action": "add-column",
  "rule-target": "column",
  "object-locator": {
    "schema-name": "SPORTS",
    "table-name": "TEST_TBL_2"
  },
  "value": "t_col2_tmp",
  "expression": "CASE LOWER(SUBSTR(HEX($T_COL2), 1, 8) || '-' || SUBSTR(HEX($T_COL2), 9, 4) || '-' || SUBSTR(HEX($T_COL2), 13, 4) || '-' || SUBSTR(HEX($T_COL2), 17, 4) || '-' || SUBSTR(HEX($T_COL2), 21, 12)) WHEN '----' THEN NULL ELSE LOWER(SUBSTR(HEX($T_COL2), 1, 8) || '-' || SUBSTR(HEX($T_COL2), 9, 4) || '-' || SUBSTR(HEX($T_COL2), 13, 4) || '-' || SUBSTR(HEX($T_COL2), 17, 4) || '-' || SUBSTR(HEX($T_COL2), 21, 12)) END",
  "data-type": {
    "type": "string",
    "length": 60
  }
}
```

**Example 將新的日期欄新增到目標資料表**  
下列範例會將新的資料欄 `createdate` 新增至目標資料表 `employee`。當您使用 SQLite 日期函數 `datetime` 時，已插入每一列所新建的資料表中都會新增該日期。  

```
  {
      "rule-type": "transformation",
      "rule-id": "2",
      "rule-name": "2",
      "rule-action": "add-column",
      "rule-target": "column",
      "object-locator": {
        "schema-name": "public",
        "table-name": "employee"
      },
      "value": "createdate",
      "expression": "datetime ()",
      "data-type": {
        "type": "datetime",
        "precision": 6
      }
  }
```

**Example 將新的數值欄新增至目標資料表**  
下列範例會將新的數值欄 `rounded_emp_salary` 新增至目標資料表 `employee`。它使用 SQLite `round` 函數來新增四捨五入的薪資。  

```
  {
      "rule-type": "transformation",
      "rule-id": "2",
      "rule-name": "2",
      "rule-action": "add-column",
      "rule-target": "column",
      "object-locator": {
        "schema-name": "public",
        "table-name": "employee"
      },
      "value": "rounded_emp_salary",
      "expression": "round($emp_salary)",
      "data-type": {
        "type": "int8"
      }
  }
```

**Example 使用雜湊函數將新的字串欄新增至目標資料表**  
下列範例會將新的字串欄 `hashed_emp_number` 新增至目標資料表 `employee`。SQLite `hash_sha256(x)` 函數會在目標上為來源資料欄 `emp_number` 建立雜湊值。  

```
  {
      "rule-type": "transformation",
      "rule-id": "2",
      "rule-name": "2",
      "rule-action": "add-column",
      "rule-target": "column",
      "object-locator": {
        "schema-name": "public",
        "table-name": "employee"
      },
      "value": "hashed_emp_number",
      "expression": "hash_sha256($emp_number)",
      "data-type": {
        "type": "string",
        "length": 64
      }
  }
```

## 使用表達式將中繼資料新增至目標資料表
<a name="CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Expressions-Metadata"></a>

您可以使用下列表達式將中繼資料資訊新增至目標資料表：
+ `$AR_M_SOURCE_SCHEMA` – 來源結構描述的名稱。
+ `$AR_M_SOURCE_TABLE_NAME` – 來源資料表的名稱。
+ `$AR_M_SOURCE_COLUMN_NAME` – 來源資料表中的資料行名稱。
+ `$AR_M_SOURCE_COLUMN_DATATYPE` – 來源資料表中的資料行名稱。

**Example 使用來源中的模式名稱，新增結構描述名稱的資料欄**  
下列範例會使用來源中的結構描述名稱，將名為 `schema_name` 的新欄新增至目標。  

```
  {
      "rule-type": "transformation",
      "rule-id": "2",
      "rule-name": "2",
      "rule-action": "add-column",
      "rule-target": "column",
      "object-locator": {
        "schema-name": "%",
        "table-name": "%"
      },
      "rule-action": "add-column",
      "value":"schema_name",
      "expression": "$AR_M_SOURCE_SCHEMA", 
      "data-type": { 
         "type": "string",
         "length": 50
      }
  }
```

# 資料表和集合設定規則與操作
<a name="CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Tablesettings"></a>

使用資料表設定指定您想套用到所選取資料表或檢視特定操作的任何設定。資料表設定規則為選用項目，取決於您的端點和遷移需求。

MongoDB 和 Amazon DocumentDB 資料庫不使用資料表和檢視，而是將資料記錄儲存為文件，並集中在*集合*內。任何 MongoDB 或 Amazon DocumentDB 端點的單一資料庫是依資料庫名稱識別的一組特定集合。

從 MongoDB 或 Amazon DocumentDB 來源遷移時，您使用的平行載入設定略有不同。在這種情況下，針對平行載入設定的自動分段或範圍分割類型，請考慮所選集合，而不是資料表和檢視表。

**Topics**
+ [

## 資料表設定中的萬用字元受到限制
](#CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Tablesettings.Wildcards)
+ [

## 在選取的資料表、檢視和集合使用平行載入
](#CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Tablesettings.ParallelLoad)
+ [

## 指定所選資料表或檢視的 LOB 設定
](#CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Tablesettings.LOB)
+ [

## 資料表設定範例
](#CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Tablesettings.Examples)

針對使用資料表設定規則類型的資料表映射規則，可套用下列參數。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/dms/latest/userguide/CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Tablesettings.html)

## 資料表設定中的萬用字元受到限制
<a name="CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Tablesettings.Wildcards"></a>

來源資料庫不支援在 `"table-settings"` 規則中使用百分比萬用字元 (`"%"`)，如下所示。

```
{
    "rule-type": "table-settings",
    "rule-id": "8",
    "rule-name": "8",
    "object-locator": {
        "schema-name": "ipipeline-prod",            
        "table-name": "%"
    },
    "parallel-load": {
        "type": "partitions-auto",
        "number-of-partitions": 16,
        "collection-count-from-metadata": "true",
        "max-records-skip-per-page": 1000000,
        "batch-size": 50000
    }
  }
```

如果您在如下所示的`"table-settings"`規則`"%"`中使用 ，則 會 AWS DMS 傳回以下例外狀況。

```
Error in mapping rules. Rule with ruleId = x failed validation. Exact 
schema and table name required when using table settings rule.
```

此外， AWS 建議您不要使用具有 的單一任務載入大量大型集合`parallel-load`。請注意， AWS DMS 會限制資源爭用以及 `MaxFullLoadSubTasks` 任務設定參數值平行載入的區段數目，最大值為 49。

作為替代，請指定來源資料庫的所有大型集合，方法是分別指定 `"schema-name"` 和 `"table-name"`。此外，也請正確縱向擴展您的遷移。例如，在數量充足的複寫執行個體上執行多項任務，以處理資料庫中大量的大型集合。

## 在選取的資料表、檢視和集合使用平行載入
<a name="CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Tablesettings.ParallelLoad"></a>

若要加速遷移並讓程序更有效率，您可以對所選資料表、檢視和集合使用平行載入。換言之，您可以平行使用多個執行緒來遷移單一區段的資料表、檢視或集合。若要這樣做， 會將完整載入任務 AWS DMS 分割為執行緒，並將每個資料表區段配置給自己的執行緒。

使用此平行載入程序，可以用多重執行緒從來源端點平行卸載多個資料表、檢視和集合。然後讓多重執行緒平行遷移及載入相同的資料表、檢視和集合到目標端點。針對某些資料庫引擎，您可以依分割區或子分割區來區隔資料表和檢視。對於其他資料庫引擎，您可以根據特定參數 AWS DMS 自動分割集合 （自動分割）。或者，您可依指定的資料欄值範圍來區隔任何資料表或檢視。

平行載入支援於以下的來源端點：
+ Oracle
+ Microsoft SQL Server
+ MySQL
+ PostgreSQL
+ IBM Db2 LUW
+ SAP Adaptive Server Enterprise (ASE)
+ MongoDB (僅支援平行完全載入的自動分段和範圍分段選項)
+ Amazon DocumentDB (僅支援平行完全載入的自動分段和範圍分段選項)

對於 MongoDB 和 Amazon DocumentDB 端點， AWS DMS 支援下列資料欄的資料類型，這些資料欄是平行完全載入的範圍分割選項的分割區索引鍵。
+ Double
+ String
+ ObjectId
+ 32 位元整數
+ 64 位元整數

下列目標端點支援與資料表設定規則搭配使用的平行負載：
+ Oracle
+ Microsoft SQL Server
+ MySQL
+ PostgreSQL
+ Amazon S3
+ SAP Adaptive Server Enterprise (ASE)
+ Amazon Redshift
+ MongoDB (僅支援平行完全載入的自動分段和範圍分段選項)
+ Amazon DocumentDB (僅支援平行完全載入的自動分段和範圍分段選項)
+ Db2 LUW

若要指定要平行載入的資料表和檢視數量上限，請使用 `MaxFullLoadSubTasks` 任務設定。

若要為平行載入任務的支援目標指定每個資料表或檢視的執行緒數目上限，請使用資料欄值邊界定義更多區段。

**重要**  
`MaxFullLoadSubTasks` 控制要平行載入的資料表或資料表區段數目。`ParallelLoadThreads` 控制遷移任務用來平行執行載入的執行緒數目。*這些設定會相乘*。因此，在完全載入任務期間所使用的執行緒總數，大約是 `ParallelLoadThreads `值乘以 `MaxFullLoadSubTasks` (`ParallelLoadThreads` **\$1** `MaxFullLoadSubtasks)` 的值.  
如果您建立具有大量「完全載入」子任務和大量平行載入執行緒的任務，則任務可能會耗用太多記憶體而失敗。

若要指定 Amazon DynamoDB、Amazon Kinesis Data Streams、Apache Kafka 或 Amazon Elasticsearch Service 目標的每個資料表執行緒數目上限，請使用 `ParallelLoadThreads` 目標中繼資料任務設定。

若要指定使用 `ParallelLoadThreads` 時平行載入任務的緩衝區大小，請使用 `ParallelLoadBufferSize` 目標中繼資料任務設定。

`ParallelLoadThreads` 和 `ParallelLoadBufferSize` 的可用性和設定取決於目標端點。

如需 `ParallelLoadThreads` 和 `ParallelLoadBufferSize` 設定的詳細資訊，請參閱：[目標中繼資料任務設定](CHAP_Tasks.CustomizingTasks.TaskSettings.TargetMetadata.md)。如需 `MaxFullLoadSubTasks` 設定的詳細資訊，請參閱[完全載入任務設定](CHAP_Tasks.CustomizingTasks.TaskSettings.FullLoad.md)。如需目標端點的特有資訊，請參閱相關主題。

若要使用平行載入，請使用 `parallel-load` 選項建立 `table-settings` 類型的資料表映射規則。在 `table-settings` 規則中，您可以指定要平行載入的單一資料表、檢視或集合的區隔條件。若要這樣做，請將 `parallel-load` 選項的 `type` 參數設定為數個選項之一。

此做法取決於您如何將資料表、檢視或集合分段以進行平行負載：
+ 依分割區 (或區段) – 使用 `partitions-auto` 類型載入所有現有的資料表或檢視分割區 (或區段)。或者也可以使用指定分割區陣列的 `partitions-list` 類型，只載入選擇的分割區。

  僅針對 MongoDB 和 Amazon DocumentDB 端點，依區段載入所有或指定的集合，這些區段也會使用 `partitions-auto`類型和其他選用`table-settings`參數 AWS DMS 自動計算。
+ (僅限 Oracle 端點) 依子分割區 – 使用 `subpartitions-auto` 類型載入所有現有的資料表或檢視子分割區。或者也可以使用所指定 `subpartitions` 陣列的 `partitions-list` 類型，只載入選擇的子分割區。
+ 依您定義的區段 – 使用資料欄值邊界，載入您定義的資料表、檢視或集合區段。若要這樣做，請使用 `ranges` 類型與指定的 `columns` 和 `boundaries` 陣列。
**注意**  
PostgreSQL 僅支援此類型的平行負載。MongoDB 和 Amazon DocumentDB 作為來源端點時，同時支援此範圍分段類型和平行完全載入的自動分段類型 (`partitions-auto`)。

若要識別要平行載入的額外資料表、檢視或集合，請使用 `parallel-load` 選項指定額外的 `table-settings` 物件。

在下列程序中，您可以了解如何為每個平行載入類型設定 JSON 程式碼，從最簡單到最複雜。

**指定所有資料表、檢視或集合分割區，或所有資料表或檢視子分割區**
+ 使用 `partitions-auto` 類型或 `subpartitions-auto` 類型 (但不能同時使用) 指定 `parallel-load`。

  每個資料表、檢視或集合分割區 (或區段) 便會自動分配至自己的執行緒。

  對於部分端點，分割區或子分割區只有已在資料表或檢視中定義時才會參與平行載入。對於 MongoDB 和 Amazon DocumentDB 來源端點，您可以讓 根據選用的其他參數 AWS DMS 自動計算分割區 （或區段）。其中包括 `number-of-partitions`、`collection-count-from-metadata`、`max-records-skip-per-page` 和 `batch-size`。

**指定所選的資料表或檢視分割區、子分割區或兩者同時**

1. 使用 `partitions-list` 類型指定 `parallel-load`。

1. (選用) 指定分割區名稱陣列作為 `partitions` 的值，來包含分割區。

   每個指定的分割區會分配至自己的執行緒。
**重要**  
對於 Oracle 端點，請確定選擇平行載入的分割區和子分割區並未重疊。如果您使用重疊的分割區和子分割區平行載入資料，系統會複製項目，或者因主索引鍵重複違規而失敗。

1. (選用) 僅限 Oracle 端點，可指定子分割區名稱陣列作為 `subpartitions` 的值，以包含子分割區。

   接著每個指定的子分割區將分配至自己的執行緒。
**注意**  
分割區或子分割區只有已在資料表或檢視中定義時才會參與平行載入。

您可將資料表或檢視區段指定為資料欄值範圍。這麼做的時候，請注意以下資料欄特性：
+ 指定索引欄可大幅提升效能。
+ 您可以指定最多 10 個資料欄。
+ 您無法使用資料欄定義具有下列 AWS DMS 資料類型的區段邊界：DOUBLE、FLOAT、BLOB、CLOB 和 NCLOB
+ 不會複寫具有 Null 值的記錄。

**以資料欄值範圍指定資料表、檢視或集合區段**

1. 使用 `ranges` 類型指定 `parallel-load`。

1. 指定資料表資料欄名稱作為 `columns` 的值，來定義資料表或檢視區段之間的邊界。請針對您要定義資料表或檢視區段之間邊界的每個資料欄，執行此操作。

   資料欄的順序很重要。在定義各邊界時，第一個資料欄最重要，最後一個資料欄最不重要，如以下步驟所述。

1. 指定邊界陣列作為 `boundaries` 的值，來定義所有資料表或檢視區段的資料範圍。*邊界陣列*是資料欄值陣列的陣列。要完成此操作，請遵循以下步驟：

   1. 指定資料欄值陣列的每個元素，作為對應至每個資料欄的值。*資料欄值陣列*代表您希望定義之每個資料表或檢視區段的上邊界。依照您在 `columns` 陣列中指定資料欄的相同順序，來指定每個資料欄。

      以來源支援的格式輸入 DATE 資料欄的值。

   1. 指定每個資料欄值陣列作為上邊界，按照每個區段從底部到資料表或檢視的下一個上區段的順序。如果所指定的上邊界上方有任何資料列，這些資料列將填入資料表或檢視的上區段。因此，範圍區段的數量可能比邊界陣列中區段邊界的數量多一。每個這類的範圍區段都會分配至自己的執行緒。

      將複寫所有非 Null 的資料，即使您未定義資料表或檢視中所有資料欄的資料範圍。

   例如，假設您為 COL1、COL2 和 COL3 資料欄定義三個資料欄值陣列，如下所示。    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/dms/latest/userguide/CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Tablesettings.html)

   您已定義三個區段邊界，總數可能為四個區段。

   為了識別每個區段要複製的資料列範圍，複寫執行個體會套用搜尋方式至四個區段中的三個資料欄：搜尋類似如下：  
**區段 1**  
複寫下列為 true 的所有資料列：前兩個欄值小於或等於其對應的**區段 1** 上限邊界值。此外，第三個欄的值小於其**區段 1** 的上限邊界值。  
**區段 2**  
複寫下列為 true 的所有資料列 (**區段 1** 資料列除外)：前兩欄的值小於或等於其對應**區段 2** 的上限邊界值。此外，第三個欄的值小於其**區段 2** 的上限邊界值。  
**區段 3**  
複寫下列為 true 的所有資料列 (**區段 2** 資料列除外)：前兩欄的值小於或等於其對應**區段 3** 的上限邊界值。此外，第三個欄的值小於其**區段 3** 的上限邊界值。  
**區段 3**  
複製所有其餘的資料列 (**區段 1、2 和 3** 的資料列除外)。

   在這種情況下，複寫執行個體將建立 `WHERE` 子句，以載入每個區段，如下所示：  
**區段 1**  
`((COL1 < 10) OR ((COL1 = 10) AND (COL2 < 30)) OR ((COL1 = 10) AND (COL2 = 30) AND (COL3 < 105)))`  
**區段 2**  
`NOT ((COL1 < 10) OR ((COL1 = 10) AND (COL2 < 30)) OR ((COL1 = 10) AND (COL2 = 30) AND (COL3 < 105))) AND ((COL1 < 20) OR ((COL1 = 20) AND (COL2 < 20)) OR ((COL1 = 20) AND (COL2 = 20) AND (COL3 < 120)))`  
**區段 3**  
`NOT ((COL1 < 20) OR ((COL1 = 20) AND (COL2 < 20)) OR ((COL1 = 20) AND (COL2 = 20) AND (COL3 < 120))) AND ((COL1 < 100) OR ((COL1 = 100) AND (COL2 < 12)) OR ((COL1 = 100) AND (COL2 = 12) AND (COL3 < 99)))`  
**區段 3**  
`NOT ((COL1 < 100) OR ((COL1 = 100) AND (COL2 < 12)) OR ((COL1 = 100) AND (COL2 = 12) AND (COL3 < 99)))`

## 指定所選資料表或檢視的 LOB 設定
<a name="CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Tablesettings.LOB"></a>

您可以透過使用一或多個 `table-settings` 物件的 `lob-settings` 選項建立 `table-settings` 類型的資料表映射規則，來設定一或多個資料表的任務 LOB 設定。

支援對下列來源端點指定所選資料表或檢視的 LOB 設定：
+ Oracle
+ Microsoft SQL Server
+ MySQL
+ PostgreSQL
+ IBM Db2，視 `mode` 和 `bulk-max-size` 設定而定，如下所述
+ SAP Adaptive Server Enterprise (ASE)，視 `mode` 和 `bulk-max-size` 設定而定，如下所述

支援對下列目標端點指定所選資料表或檢視的 LOB 設定：
+ Oracle
+ Microsoft SQL Server
+ MySQL
+ PostgreSQL
+ SAP ASE，視 `mode` 和 `bulk-max-size` 設定而定，如下所述

**注意**  
只有包含主索引鍵的資料表和檢視才能使用 LOB 資料類型。

若要使用所選資料表或檢視的 LOB 設定，您可以使用 `lob-settings` 選項建立 `table-settings` 類型的資料表映射規則。這麼做會指定由 `object-locator` 選項所識別資料表或檢視的 LOB 處理方式。在 `table-settings` 規則中，您可以用下列參數指定 `lob-settings` 物件：
+ `mode` – 指定處理所選資料表或檢視的 LOB 遷移機制，如下所示：
  + `limited` – 此預設的有限 LOB 模式是速度最快且最有效率的模式。此模式只適用於當您所有的 LOB 皆為小型 (大小為 100 MB 以內) 或目標端點不支援不限 LOB 大小。此外，如果您使用 `limited`，所有 LOB 都需要落在您設定的 `bulk-max-size` 大小內。

    在完全載入任務的這個模式下，複寫執行個體將遷移內嵌於主要資料表或檢視儲存中其他資料欄資料類型的所有 LOB。不過，執行個體會將任何大於 `bulk-max-size` 值的已遷移 LOB 截斷為指定的大小。針對變更資料擷取 (CDC) 載入任務，執行個體會使用來源資料表查詢來遷移所有 LOB，如同在標準的完整 LOB 模式下 (請參閱以下內容)。
**注意**  
您只能遷移完全載入任務的檢視。
  + `unlimited` – 完整 LOB 模式的遷移機制取決於您在 `bulk-max-size` 設定的值，如下所示：
    + **標準完整 LOB 模式** – `bulk-max-size` 設定為零時，複寫執行個體會使用標準完整 LOB 模式遷移所有 LOB。此模式需要在來源資料表或檢視中查詢，以遷移每個 LOB，無論大小。此方法通常會導致遷移速度變得比有限 LOB 模式更慢。此模式只能在所有或多數 LOB 為大型 (1 GB 或更大) 時使用。
    + **組合完整 LOB 模式** – 當您將 `bulk-max-size` 設為非零值時，這個完整 LOB 模式將組合使用有限 LOB 模式和標準完整 LOB 模式。也就是說，對於完全載入任務，如果 LOB 大小在您的 `bulk-max-size` 值以下，執行個體將遷移 LOB 內嵌，如同在有限 LOB 模式下。如果 LOB 大小大於這個值，執行個體將使用來源資料表或檢視查詢遷移 LOB，如同在標準完整 LOB 模式下。針對變更資料擷取 (CDC) 載入任務，執行個體會使用來源資料表查詢來遷移所有 LOB，如同在標準的完整 LOB 模式下 (請參閱以下內容)。此行為不考慮 LOB 大小。
**注意**  
您只能遷移完全載入任務的檢視。

      此模式的遷移速度介於比較快的有限 LOB 模式和比較慢的標準完整 LOB 模式之間。此模式只適合在您同時擁有小型和大型 LOB 且多數 LOB 為小型時使用。

      此組合完整 LOB 模式僅適用於以下端點：
      + 做為來源的 IBM Db2 
      + 做為來源或目標的 SAP ASE

    無論您為 `unlimited` 模式指定何種機制，執行個體都會完整遷移所有的 LOB，不會截斷。
  + `none` – 複寫執行個體將使用任務 LOB 設定遷移所選資料表或檢視中的 LOB。使用此選項，可協助比較有無針對所選資料表或檢視使用 LOB 設定的遷移結果。

  如果指定的資料表或檢視有 LOB 包含在複寫內時，只有在使用 `limited` LOB 模式時，才能將 `BatchApplyEnabled` 任務設定設為 `true`。

  在某些情況下，您可能會將 `BatchApplyEnabled` 設定為 `true`，並將 `BatchApplyPreserveTransaction` 設定為 `false`。在這些情況下，執行個體會在資料表或檢視有 LOB 且來源和目標端點為 Oracle 時，將 `BatchApplyPreserveTransaction` 設定為 `true`。
+ `bulk-max-size` – 將此值設為零值或非零值 (以 KB 為單位)，視先前項目中所述的 `mode` 而定。在 `limited` 模式下，您必須為此參數設定非零的值。

  執行個體會將 LOB 轉換為二進位格式。因此，若要指定您需要複寫的最大的 LOB，請將其大小乘上三倍。例如，若您最大型的 LOB 是 2 MB，請將 `bulk-max-size` 設定為 6000 (6 MB)。

## 資料表設定範例
<a name="CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Tablesettings.Examples"></a>

以下是示範如何使用資料表設定的一些範例。

**Example 載入依分割區分段的資料表**  
以下範例依所有分割區平行載入，可更有效地載入來源中的 `SALES` 資料表。  

```
{
   "rules": [{
            "rule-type": "selection",
            "rule-id": "1",
            "rule-name": "1",
            "object-locator": {
                "schema-name": "%",
                "table-name": "%"
            },
            "rule-action": "include"
        },
        {
            "rule-type": "table-settings",
            "rule-id": "2",
            "rule-name": "2",
            "object-locator": {
                "schema-name": "HR",
                "table-name": "SALES"
            },
            "parallel-load": {
                "type": "partitions-auto"
            }
        }
     ]
}
```

**Example 載入依子分割區分段的資料表**  
以下範例依所有子分割區平行載入，可更有效地載入 Oracle 來源中的 `SALES` 資料表。  

```
{
   "rules": [{
            "rule-type": "selection",
            "rule-id": "1",
            "rule-name": "1",
            "object-locator": {
                "schema-name": "%",
                "table-name": "%"
            },
            "rule-action": "include"
        },
        {
            "rule-type": "table-settings",
            "rule-id": "2",
            "rule-name": "2",
            "object-locator": {
                "schema-name": "HR",
                "table-name": "SALES"
            },
            "parallel-load": {
                "type": "subpartitions-auto"
            }
        }
     ]
}
```

**Example 載入依分割區清單分段的資料表**  
以下範例依特定分割區清單平行載入，以載入來源中的 `SALES` 資料表。在這種情況下，指定分割區將按英文字母部分開頭的值命名，例如 `ABCD`、`EFGH` 等。  

```
{
    "rules": [{
            "rule-type": "selection",
            "rule-id": "1",
            "rule-name": "1",
            "object-locator": {
                "schema-name": "%",
                "table-name": "%"
            },
            "rule-action": "include"
        },
        {
            "rule-type": "table-settings",
            "rule-id": "2",
            "rule-name": "2",
            "object-locator": {
                "schema-name": "HR",
                "table-name": "SALES"
            },
            "parallel-load": {
                "type": "partitions-list",
                "partitions": [
                    "ABCD",
                    "EFGH",
                    "IJKL",
                    "MNOP",
                    "QRST",
                    "UVWXYZ"
                ]
            }
        }
    ]
}
```

**Example 載入依所選分割區和子分割區清單分段的 Oracle 資料表**  
以下範例依所選分割區和子分割區清單平行載入，以載入 Oracle 來源中的 `SALES` 資料表。在這種情況下，指定分割區將按英文字母部分開頭的值命名，例如 `ABCD`、`EFGH` 等。指定的分割區將按數字開頭的值來命名，例如 `01234` 和 `56789`。  

```
{
    "rules": [{
            "rule-type": "selection",
            "rule-id": "1",
            "rule-name": "1",
            "object-locator": {
                "schema-name": "%",
                "table-name": "%"
            },
            "rule-action": "include"
        },
        {
            "rule-type": "table-settings",
            "rule-id": "2",
            "rule-name": "2",
            "object-locator": {
                "schema-name": "HR",
                "table-name": "SALES"
            },
            "parallel-load": {
                "type": "partitions-list",
                "partitions": [
                    "ABCD",
                    "EFGH",
                    "IJKL",
                    "MNOP",
                    "QRST",
                    "UVWXYZ"
                ],
                "subpartitions": [
                    "01234",
                    "56789"
                ]
            }
        }
    ]
}
```

**Example 載入依資料行值範圍分段的資料表**  
以下範例依 `SALES_NO` 和 `REGION` 資料欄值範圍指定之區段平行載入，以載入來源中的 `SALES` 資料表。  

```
{
    "rules": [{
            "rule-type": "selection",
            "rule-id": "1",
            "rule-name": "1",
            "object-locator": {
                "schema-name": "%",
                "table-name": "%"
            },
            "rule-action": "include"
        },
        {
            "rule-type": "table-settings",
            "rule-id": "2",
            "rule-name": "2",
            "object-locator": {
                "schema-name": "HR",
                "table-name": "SALES"
            },
            "parallel-load": {
                "type": "ranges",
                "columns": [
                    "SALES_NO",
                    "REGION"
                ],
                "boundaries": [
                    [
                        "1000",
                        "NORTH"
                    ],
                    [
                        "3000",
                        "WEST"
                    ]
                ]
            }
        }
    ]
}
```
在這種情況下，將使用 `SALES_NO` 和 `REGION` 名稱指定兩個資料欄的區段範圍。兩個邊界以兩組資料欄值 (`["1000","NORTH"]` 和 `["3000","WEST"]`) 指定。  
這兩個邊界將識別下列要平行載入的三個資料表區段：    
區段 1  
`SALES_NO` 小於或等於 1000 且 `REGION` 低於「NORTH」的資料列。也就是，在 EAST 區域最高至 1000 的銷售額。  
區段 2  
**區段 1** 以外、`SALES_NO` 小於或等於 3000 且 `REGION` 低於「WEST」的資料列。也就是，在 NORTH 和 SOUTH 區域超過 1000 最高至 3000 的銷售額。  
區段 3  
**區段 1** 和**區段 2** 以外所有其他的資料列。也就是，在 WEST 區域超過 3,000 的銷售額。

**Example 載入兩個資料表：一個依範圍分段，另一個依分割區分段**  
以下範例會依您所識別的區段邊界，平行載入 `SALES` 資料表。並依所有分割區平行載入 `ORDERS` 資料表，如同先前的範例。  

```
{
    "rules": [{
            "rule-type": "selection",
            "rule-id": "1",
            "rule-name": "1",
            "object-locator": {
                "schema-name": "%",
                "table-name": "%"
            },
            "rule-action": "include"
        },
        {
            "rule-type": "table-settings",
            "rule-id": "2",
            "rule-name": "2",
            "object-locator": {
                "schema-name": "HR",
                "table-name": "SALES"
            },
            "parallel-load": {
                "type": "ranges",
                "columns": [
                    "SALES_NO",
                    "REGION"
                ],
                "boundaries": [
                    [
                        "1000",
                        "NORTH"
                    ],
                    [
                        "3000",
                        "WEST"
                    ]
                ]
            }
        },
        {
            "rule-type": "table-settings",
            "rule-id": "3",
            "rule-name": "3",
            "object-locator": {
                "schema-name": "HR",
                "table-name": "ORDERS"
            },
            "parallel-load": {
                "type": "partitions-auto" 
            }
        }
    ]
}
```

**Example 使用任務 LOB 設定載入含 LOB 的資料表**  
以下範例使用任務 LOB 設定載入來源中的 `ITEMS` 資料表，包含所有 LOB。將忽略 100 MB 的 `bulk-max-size` 設定，並退出快速重設為 `limited` 或 `unlimited` 模式。  

```
{
   "rules": [{
            "rule-type": "selection",
            "rule-id": "1",
            "rule-name": "1",
            "object-locator": {
                "schema-name": "%",
                "table-name": "%"
            },
            "rule-action": "include"
        },
        {
            "rule-type": "table-settings",
            "rule-id": "2",
            "rule-name": "2",
            "object-locator": {
                "schema-name": "INV",
                "table-name": "ITEMS"
            },
            "lob-settings": {
                "mode": "none",
                "bulk-max-size": "100000"
            }
        }
     ]
}
```

**Example 使用有限 LOB 模式載入含 LOB 的資料表**  
以下範例使用有限 LOB 模式 (預設值) 載入來源中的 `ITEMS` 資料表，包含 LOB，最大非截斷大小為 100 MB。任何大於此大小的 LOB 將截斷為 100 MB。所有 LOB 將內嵌於所有其他資料欄資料類型載入。  

```
{
   "rules": [{
            "rule-type": "selection",
            "rule-id": "1",
            "rule-name": "1",
            "object-locator": {
                "schema-name": "%",
                "table-name": "%"
            },
            "rule-action": "include"
        },
        {
            "rule-type": "table-settings",
            "rule-id": "2",
            "rule-name": "2",
            "object-locator": {
                "schema-name": "INV",
                "table-name": "ITEMS"
            },
            "lob-settings": {
                "bulk-max-size": "100000"
            }
        }
     ]
}
```

**Example 使用標準完整 LOB 模式載入含 LOB 的資料表**  
以下範例使用標準完整 LOB 模式載入來源中的 `ITEMS` 資料表，包含其所有的 LOB，無截斷。使用來源資料表中每個 LOB 的查詢，分別從其他資料類型載入所有 LOB，無論大小。  

```
{
   "rules": [{
            "rule-type": "selection",
            "rule-id": "1",
            "rule-name": "1",
            "object-locator": {
                "schema-name": "%",
                "table-name": "%"
            },
            "rule-action": "include"
        },
        {
            "rule-type": "table-settings",
            "rule-id": "2",
            "rule-name": "2",
            "object-locator": {
                "schema-name": "INV",
                "table-name": "ITEMS"
            },
            "lob-settings": {
                "mode": "unlimited",
                "bulk-max-size": "0"
            }
        }
     ]
}
```

**Example 使用組合完整 LOB 模式載入含 LOB 的資料表**  
以下範例使用組合完整 LOB 模式載入來源中的 `ITEMS` 資料表，包含其所有的 LOB，無截斷。將內嵌於其他資料類型載入大小在 100 MB 以內的所有 LOB，如同在有限 LOB 模式下。所有大小超過 100 MB 的 LOB 都會與其他資料類型分開載入。此個別載入會對來源資料表中的每個這類 LOB 使用查詢，如標準完整 LOB 模式所示。  

```
{
   "rules": [{
            "rule-type": "selection",
            "rule-id": "1",
            "rule-name": "1",
            "object-locator": {
                "schema-name": "%",
                "table-name": "%"
            },
            "rule-action": "include"
        },
        {
            "rule-type": "table-settings",
            "rule-id": "2",
            "rule-name": "2",
            "object-locator": {
                "schema-name": "INV",
                "table-name": "ITEMS"
            },
            "lob-settings": {
                "mode": "unlimited",
                "bulk-max-size": "100000"
            }
        }
     ]
}
```

# 使用資料遮罩來隱藏敏感資訊
<a name="CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Masking"></a>

若要隱藏儲存在要遷移之資料表的一或多個資料欄中的敏感資料，您可以利用資料遮罩轉換規則動作。從 3.5.4 版開始， AWS DMS 允許在資料表映射中使用資料遮罩轉換規則動作，讓您在遷移程序期間變更一或多個資料欄的內容。 會將修改的資料 AWS DMS 載入目標資料表。

AWS Database Migration Service 提供三種資料遮罩轉換規則動作的選項：
+ 資料遮罩：數字遮罩
+ 資料遮罩：數字隨機化
+ 資料遮罩：雜湊遮罩

這些資料遮罩轉換規則動作可在複寫任務的資料表映射中設定，類似於其他轉換規則。規則目標應設定為資料欄層級。

## 使用遮罩字元遮罩資料欄中的數字
<a name="CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Masking.Numbers"></a>

「資料遮罩：數字遮罩」轉換規則動作可讓您將數字取代為您指定的單一 ASCII 可列印字元 （不含空白或空格字元），以遮罩一或多個資料欄中的數值資料。

以下是使用遮罩字元遮罩`customer_master`資料表資料`cust_passport_no`欄中的所有數字，`'#'`並將遮罩的資料載入目標資料表的範例：

```
                {
    "rules": [
        {
            "rule-type": "selection",
            "rule-id": "1",
            "rule-name": "1",
            "object-locator": {
                "schema-name": "cust_schema",
                "table-name": "%"
            },
            "rule-action": "include"
        },
        {
            "rule-type": "transformation",
            "rule-id": "2",
            "rule-name": "2",
            "rule-target": "column",
            "object-locator": {
                "schema-name": "cust_schema",
                "table-name": "customer_master",
                "column-name": "cust_passport_no"
            },
            "rule-action": "data-masking-digits-mask",
            "value": "#"
        }
    ]
}
```

例如，如果來源資料表`cust_passport_no`中的資料欄包含記錄 "C6BGJ566669K"， AWS DMS 任務會將此資料寫入目標資料表做為 `"C#BGJ######K"`。

## 以隨機數字取代資料欄中的數字
<a name="CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Masking.Random"></a>

轉換規則「資料遮罩：數字隨機化」可讓您將一或多個資料欄中的每個數字取代為隨機數字。在下列範例中， `customer_master`會以隨機數字 AWS DMS 取代來源資料表資料`cust_passport_no`欄中的每個數字，並將修改後的資料寫入目標資料表：

```
            {
    "rules": [
        {
            "rule-type": "selection",
            "rule-id": "1",
            "rule-name": "1",
            "object-locator": {
                "schema-name": "cust_schema",
                "table-name": "%"
            },
            "rule-action": "include"
        },
        {
            "rule-type": "transformation",
            "rule-id": "2",
            "rule-name": "2",
            "rule-target": "column",
            "object-locator": {
                "schema-name": "cust_schema",
                "table-name": "customer_master",
                "column-name": "cust_passport_no"
            },
            "rule-action": "data-masking-digits-randomize"
        }
    ]
}
```

例如， AWS DMS 任務會將來源資料表 `"C6BGJ566669K"``cust_passport_no`欄中的值轉換為 ，`"C1BGJ842170K"`並將其寫入目標資料庫。

## 將資料欄資料取代為雜湊值
<a name="CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Masking.Hash"></a>

轉換規則「資料遮罩：雜湊遮罩」可讓您將資料欄資料取代為使用`SHA256`演算法產生的雜湊。雜湊的長度一律為 64 個字元，因此目標資料表資料欄長度至少應為 64 個字元。或者，您可以將`change-data-type`轉換規則動作新增至資料欄，以增加目標資料表中資料欄的寬度。

下列範例會為來源資料表資料`cust_passport_no`欄中的資料產生 64 個字元長的雜湊值，`customer_master`並在增加資料欄長度後將轉換的資料載入目標資料表：

```
{
"rules": [
{
"rule-type": "selection",
"rule-id": "1",
"rule-name": "1",
"object-locator": {
"schema-name": "cust_schema",
"table-name": "%"
},
"rule-action": "include"
},
{
"rule-type": "transformation",
"rule-id": "2",
"rule-name": "2",
"rule-target": "column",
"object-locator": {
"schema-name": "cust_schema",
"table-name": "customer_master",
"column-name": "cust_passport_no"
},
"rule-action": "change-data-type",
"data-type": {
"type": "string",
"length": "100",
"scale": ""
}
},
{
"rule-type": "transformation",
"rule-id": "3",
"rule-name": "3",
"rule-target": "column",
"object-locator": {
"schema-name": "cust_schema",
"table-name": "customer_master",
"column-name": "cust_passport_no"
},
"rule-action": "data-masking-hash-mask"
}
]
}
```

例如，如果來源資料表`cust_passport_no`的資料欄包含值 `“C6BGJ566669K”`， AWS DMS 任務會將雜湊寫入`“7CB06784764C9030CCC41E25C15339FEB293FFE9B329A72B5FED564E99900C75”`目標資料表。

## 限制
<a name="CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Masking.Limitations"></a>
+ 每個資料遮罩轉換規則選項僅支援特定 AWS DMS 資料類型：
  + 資料遮罩：資料類型的資料欄支援數字遮罩： `WSTRING`和 `STRING`。
  + 資料遮罩：資料類型資料欄支援數位隨機化：`WSTRING, STRING; NUMERIC, INT1, INT2, INT4, and INT8 `具有未簽署的對等。
  + 資料遮罩：資料類型的資料欄支援雜湊遮罩： `WSTRING`和 `STRING`。

  若要進一步了解將 AWS DMS 資料類型映射至來源引擎的資料類型，請參閱來源引擎與 AWS DMS 資料類型的資料類型映射。請參閱 [Oracle 的來源資料類型](CHAP_Source.Oracle.md#CHAP_Source.Oracle.DataTypes)、[SQL Server 的來源資料類型](CHAP_Source.SQLServer.md#CHAP_Source.SQLServer.DataTypes)、 [PostgreSQL 的來源資料類型](CHAP_Source.PostgreSQL.md#CHAP_Source-PostgreSQL-DataTypes)和 的來源資料類型[MySQL 的來源資料類型](CHAP_Source.MySQL.md#CHAP_Source.MySQL.DataTypes)。
+ 針對資料類型不相容的資料欄使用資料遮罩規則動作，會導致 DMS 任務發生錯誤。請參閱 DMS 任務設定中的 DataMaskingErrorPolicy，以指定錯誤處理行為。如需 `DataMaskingErrorPolicy` 的相關資訊，請參閱 [錯誤處理任務設定](CHAP_Tasks.CustomizingTasks.TaskSettings.ErrorHandling.md)。
+ 如果您計劃使用的遮罩選項不支援來源資料欄類型，您可以新增change-data-type轉換規則動作，將資料欄的資料類型變更為相容的類型。`change-data-type` 轉換`rule-id`的 應該比遮罩轉換的 rule-id 更小，因此資料類型變更會在遮罩之前發生。
+ 使用資料遮罩：遮罩主索引鍵/唯一索引鍵/外部索引鍵資料欄的雜湊遮罩動作，因為產生的雜湊值將是唯一且一致。其他兩個遮罩選項無法保證唯一性。
+ 資料遮罩：數字遮罩和資料遮罩：數字隨機化只會影響資料欄資料中的數字，不會影響資料長度，資料遮罩：雜湊遮罩會修改整個資料欄，資料長度變更為 64 個字元。因此，應該為要遮罩的資料欄新增要相應建立的目標資料表或 change-data-type 轉換規則。
+ 具有指定資料遮罩轉換規則動作的資料欄會從資料驗證中排除 AWS DMS。如果遮罩主索引鍵/唯一索引鍵資料欄，將不會對此資料表執行資料驗證；該資料表的驗證狀態將等於 `No Primary key`。