

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

# 转换规则和操作
<a name="CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Transformations"></a>

可使用转换操作指定要应用于所选架构、表或视图的任何转换。转换规则是可选的。

## 限制
<a name="CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Transformations.Limitations"></a>
+ 不能对同一个对象（架构、表、列、表-表空间或索引-表空间）应用多个转换规则操作。只要每个转换操作应用于不同的对象，那么可以在任何级别应用多个转换规则操作。但是，当使用数据掩蔽转换规则时，此限制不适用。在这种规则中，您可以对同一列进行其他转换，例如 `ADD-COLUMN` 或 `CHANGE-DATA-TYPE`。
+ 转换规则中的表名称和列名称是区分大小写的。例如，Oracle 或 Db2 数据库的表名称和列名称必须以大写形式提供。
+ 不支持使用 Right-to-Left语言的列名进行转换。
+ 对于名称中包含特殊字符（如 \#、\\、/、-）的列，无法执行转换。
+ 对于映射到 BLOB/CLOB 数据类型的列，唯一支持的转换是将该列放在目标上。
+ AWS DMS 不支持将两个源表复制到单个目标表。 AWS DMS 根据复制任务的转换规则，将记录从一个表复制到另一个表以及从一个列复制到另一个列。对象名称必须唯一，以防止重叠。

  例如，源表包含名为 `ID` 的列，而对应的目标表预先存在名为 `id` 的列。如果规则使用`ADD-COLUMN`语句添加名为的新列`id`，并使用 SQLite 语句在列中填充自定义值，则会创建一个名为但不支持的重复的`id`、模棱两可的对象。
+ 创建转换规则时，建议仅在选择规则指定多列时（例如，当您将 `column-name` 设置为 `%` 时）才使用 `data-type` 参数。建议不要使用 `data-type` 选择单列。
+ AWS DMS 不支持源对象和目标对象（表）位于同一数据库/架构上的转换规则。在转换规则中同时使用同一个表作为源表和目标表可能会导致意外且可能有害的结果，包括但不限于表数据的意外更改、表结构的修改甚至表被删除。

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

对于使用转换规则类型的表映射规则，可应用以下值。


| 参数 | 可能的值 | 说明 | 
| --- | --- | --- | 
| rule-type | transformation | 一个将规则应用于选择规则所指定的每个对象的值。使用 transformation（除非另有说明）。 | 
| rule-id | 一个数字值。 | 一个用于标识规则的唯一数字值。如果您为同一个对象（架构、表、列、表间空间或索引表空间）指定多个转换规则，则使用较低的规则 ID AWS DMS 应用转换规则。 | 
| rule-name | 一个字母数字值。 | 一个用于标识规则的唯一名称。 | 
| object-locator | 一个带以下参数的对象：[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/dms/latest/userguide/CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Transformations.html) | 规则应用于的每个架构、表或视图、表的表空间、索引表空间和列的名称。您可以使用“%”百分比符号作为每个 `object-locator` 参数的值的全部或一部分的通配符，但 `data-type` 除外。因此，您可以匹配这些项目：[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/dms/latest/userguide/CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Transformations.html)<br />此外，`table-tablespace-name` 或 `index-tablespace-name` 参数仅可用于匹配 Oracle 源端点。您可以在单个规则中指定 `table-tablespace-name` 或 `index-tablespace-name`，但不能同时指定两者。因此，您可以匹配以下*任一* 项：[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/dms/latest/userguide/CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Transformations.html) | 
| rule-action | `add-column`, `include-column`, `remove-column`<br />`rename`<br />`convert-lowercase`, `convert-uppercase`<br />`add-prefix`, `remove-prefix`, `replace-prefix`<br />`add-suffix`, `remove-suffix`, `replace-suffix`<br />`define-primary-key`<br />`change-data-type`<br />`add-before-image-columns`<br />`data-masking-digits-mask`<br />`data-masking-digits-randomize`<br />`data-masking-hash-mask` | 要应用于对象的转换。所有转换规则操作都区分大小写。<br />`rule-action` 参数的 `add-column` 值会将列添加到表中。但是无法添加与同一个表中现有列同名的新列。<br />与 `expression` 和 `data-type` 参数结合使用时，`add-column` 指定新列数据的值。<br />`rule-action` 的 `change-data-type` 值仅适用于 `column` 规则目标。<br />`rule-action` 参数的 `include-column` 值会将表的模式更改为*默认删除所有列*和*包括指定的列*。通过多次调用 `include-column` 规则，可以在目标中包含多列。<br />如果 `define-primary-key` 规则的架构或表名称中包含通配符（`%`），则无法使用该规则。<br />对于现有任务，更改目标表架构的转换规则操作（例如 `remove-column`、`rename` 或 `add-prefix`）在您重新启动任务后才会生效。如果在添加转换规则后继续执行任务，则可能会看到更改后的列出现意外行为，其中可能包括缺少列数据。需要重新启动任务才能确保转换规则正常工作。<br />`data-masking-digits-mask`、`data-masking-digits-randomize` 和 `data-masking-hash-mask` 用于在将表加载到目标时，掩蔽表中一列或多列中包含的敏感信息。这些转换仅适用于列规则目标。有关更多详细信息，请参阅 [使用数据掩蔽隐藏敏感信息](CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Masking.md)  | 
| rule-target | schema, table, column, table-tablespace, index-tablespace | 要转换的对象类型。`table-tablespace` 和 `index-tablespace` 值仅适用于 Oracle 目标端点。<br />请确保为指定作为 `object-locator`: `table-tablespace-name` 或 `index-tablespace-name` 名称一部分的参数指定值。 | 
| value | 一个字母数字值，该值遵循目标类型的命名规则。 | 需要输入的操作的新值，例如 rename。 | 
| old-value | 一个字母数字值，该值遵循目标类型的命名规则。 | 需要替换的操作的旧值，例如 replace-prefix。 | 
| data-type | `type` – 如果 `rule-action` 为 `add-column`，则为要使用的数据类型；如果 `rule-action` 为 `change-data-type`，则为替换数据类型。<br />或者为替换数据类型的名称（如果 `rule-action` 为 `change-data-type`、`column-name` 的值为 `"%"`），并且，用于标识现有数据类型的附加 `data-type` 参数包括在 `object-locator` 中。<br />AWS DMS 支持以下 DMS 数据类型的列数据类型转换：`"bytes", "date", "time", "datetime", "int1", "int2", "int4", "int8", "numeric", "real4", "real8", "string", "uint1", "uint2", "uint4", "uint8", "wstring", "blob", "nclob", "clob", "boolean", "set", "list" "map", "tuple"` AWS DMS 只能以支持的格式将一种类型转换为另一种类型。例如，DATE 应以 `YYYY:MM:DD/YYYY-MM-DD.` 表示，DATETIME 应以 `YYYY:MM:DD HH:MM:SS/YYYY-MM-DD HH:MM:SS` 表示。TIME 应以 `HH:MM:SS` 表示。 <br />`precision` – 如果添加的列或替换数据类型具有精度，则为指定精度的整数值。<br />`scale` – 如果添加的列或替换数据类型具有小数位数，则为指定小数位数的整数值或日期时间值。<br />`length` – 新列数据的长度（与 `add-column` 结合使用时）  | 以下是指定要替换的现有数据类型的 `data-type` 参数的示例。<pre>{<br />	"rules": [{<br />			"rule-type": "selection",<br />			"rule-id": "1",<br />			"rule-name": "1",<br />			"object-locator": {<br />				"schema-name": "%",<br />				"table-name": "%"<br />			},<br />			"rule-action": "include"<br />		},<br />		{<br />			"rule-type": "transformation",<br />			"rule-id": "2",<br />			"rule-name": "2",<br />			"rule-target": "column",<br />			"object-locator": {<br />				"schema-name": "test",<br />				"table-name": "table_t",<br />				"column-name": "col10"<br />			},<br />			"rule-action": "change-data-type",<br />			"data-type": {<br />				"type": "string",<br />				"length": "4092",<br />				"scale": ""<br />			}<br />		}<br />	]<br />}</pre><br />在这里，`table_t` 表的 `col10` 列更改为 `string` 数据类型。 | 
| expression | 遵循 SQLite 语法的字母数字值。 | 当与 `rule-action` 设置为 `rename-schema` 结合使用时，`expression` 参数指定一个新的架构。当与 `rule-action` 设置为 `rename-table` 结合使用时，`expression` 指定一个新表。当与 `rule-action` 设置为 `rename-column` 结合使用时，`expression` 指定一个新的列名值。<br />当与 `rule-action` 设置为 `add-column` 结合使用时，`expression` 指定构成新列的数据。<br />请注意，此参数仅支持表达式。不支持运算符和命令。<br />有关将表达式用于转换规则的更多信息，请参阅[使用转换规则表达式定义列内容](CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Expressions.md)。<br />有关 SQLite 表达式的更多信息，请参阅[使用 SQLite 函数构建表达式](CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Expressions.md#CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Expressions-SQLite)。 | 
| primary-key-def | 一个带以下参数的对象：[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/dms/latest/userguide/CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Transformations.html) | 此参数可以定义转换的表或视图上唯一键的名称、类型和内容。当 rule-action 设置为 define-primary-key 并且 rule-target 设置 table 为时，它执行此操作。默认情况下，将唯一键定义为主键。 | 
| before-image-def | 一个带以下参数的对象：[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/dms/latest/userguide/CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Transformations.html) | 此参数定义一个命名约定以标识之前映像列，并指定一个筛选器以确定哪些源列可能在目标上具有为它们创建的之前映像列。当 `rule-action` 设置为 `add-before-image-columns` 并且 `rule-target` 设置为 `column` 时，您可以指定此参数。<br />不要同时将 `column-prefix` 和 `column-suffix` 设置为空字符串。<br />对于 `column-filter`，选择：[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/dms/latest/userguide/CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Transformations.html) `before-image-def` 参数不支持大型二进制对象（LOB）数据类型，例如 CLOB 和 BLOB。如果数据类型设置为 LOB，则会在表中创建一个 void 列。 <br />有关 AWS DMS 目标端点的 before-image 支持的更多信息，请参阅：[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/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 重命名列**  
以下示例将列从 `first_name` 中的表 `Actor`（源中）重命名为 `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"
			}
		}
	]
}
```
在此，下面的语句用 1 填充相应行中的 `BI_emp_no` 列。  

```
UPDATE employees SET emp_no = 3 WHERE BI_emp_no = 1;
```
在向支持的 AWS DMS 目标写入 CDC 更新时，该`BI_emp_no`列可以判断`emp_no`列中哪些行有更新的值。