转换规则和操作 - Amazon Database Migration Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

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

转换规则和操作

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

限制

  • Amazon DMS不支持每个架构级别或每个表级别多个转换规则。但是,Amazon DMS确实每个列级别支持多个转换规则。

  • 对包括转换为小写字母的列执行多个规则操作可以防止正确进行某些转换。例如,使用convert-lowercasechange-data-type一起规则行动可能不会成功。请改用convert-lowercase规则操作单独。

  • 转换规则中的列名称区分大小写。例如,必须以大写字母为 Oracle 或 Db2 数据库提供列名称。

  • 使用从右到左语言的列不支持转换。

  • 不能对名称中包含特殊字符(例如 #、\、/、-)的列执行转换。

  • 对于映射到 BLOB/CLOB 数据类型的列,唯一支持的转换是将该列放在目标类型上。

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

参数 可能的值 描述
rule-type transformation 一个将规则应用于选择规则所指定的每个对象的值。使用 transformation(除非另有说明)。
rule-id 一个数字值。 一个用于标识规则的唯一数字值。
rule-name 一个字母数字值。 一个用于标识规则的唯一名称。
object-locator 一个带以下参数的对象:
  • schema-name— 架构的名称。对于 MongoDB 和 Amazon DocumentDB 终端节点,这是包含一组集合的数据库的名称。

  • table-name— 表、视图或集合的名称。

  • table-tablespace-name— 现有表表空间的名称。

  • index-tablespace-name— 现有索引表空间的名称。

  • column-name— 现有列的名称。

  • data-type— 现有列数据类型的名称。

规则应用于的每个架构、表或视图、表的表空间、索引表空间和列的名称。您可以使用“%”百分比符号作为每个 object-locator 参数的值的全部或一部分的通配符,但 data-type 除外。因此,您可以匹配这些项目:

  • 单个架构中的单个表或视图

  • 部分或所有架构中的单个表或视图

  • 单个架构中的部分或所有表和视图

  • 部分或全部架构中的部分或全部表和视图

  • 指定的一个或多个表、一个或多个视图以及一个或多个架构中的一个或多个列。

  • 指定多个列时,具有给定 data-type 的列。有关 data-type 的可能值,请参阅下表中说明的 data-type

此外,table-tablespace-nameindex-tablespace-name 参数仅可用于匹配 Oracle 源终端节点。您可以在单个规则中指定 table-tablespace-nameindex-tablespace-name,但不能同时指定两者。因此,您可以匹配以下任一 项:

  • 一个、部分或所有表表空间

  • 一个、部分或所有索引表空间

rule-action

add-column, include-column, remove-column

rename

convert-lowercase, convert-uppercase

add-prefix, remove-prefix, replace-prefix

add-suffix, remove-suffix, replace-suffix

define-primary-key

change-data-type

add-before-image-columns

要应用于对象的转换。所有转换规则操作都区分大小写。

rule-action 参数的 add-column 值会将列添加到表中。但是,您不能添加与同一表的现有列同名的新列。

expressiondata-type 参数结合使用时,add-column 指定新列数据的值。

rule-actionchange-data-type 值仅适用于 column 规则目标。

这些区域有:include-column的价值rule-action参数将表的模式更改为默认情况下删除所有列包括指定的列. 通过调用include-column多次规则。

rule-target schema, table, column, table-tablespace, index-tablespace 要转换的对象类型。

table-tablespaceindex-tablespace 值仅适用于 Oracle 目标终端节点。

请确保为指定作为 object-locator: table-tablespace-nameindex-tablespace-name 名称一部分的参数指定值。

value 一个字母数字值,该值遵循目标类型的命名规则。 需要输入的操作的新值,例如 rename
old-value 一个字母数字值,该值遵循目标类型的命名规则。 需要替换的操作的旧值,例如 replace-prefix
data-type

type— 要使用的数据类型(如果rule-actionadd-column或者替换数据类型如果rule-actionchange-data-type.

或者为替换数据类型的名称(如果 rule-actionchange-data-typecolumn-name 的值为 "%"),并且,用于标识现有数据类型的附加 data-type 参数包括在 object-locator 中。

Amazon 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"

precision— 如果添加的列或替换数据类型具有精度,则为指定精度的整数值。

scale— 如果添加的列或替换数据类型具有比例,则为指定比例的整数值或日期时间值。

length— 新列数据的长度(与结合使用时)add-column

以下是指定要替换的现有数据类型的 data-type 参数的示例。当 column-name 的值为 "%" 时,该现有参数 data-type 包括在 object-locator 中,如下所示。

. . . "object-locator": { "schema-name": "dbo", "table-name": "dms", "column-name": "%", "data-type": "int2" }, "data-type": { "type": "int8" }

此处,任何具有 int2 数据类型的列都将替换为 int8 数据类型。

data-typelength 值仅适用于 add-column 规则操作的 column 规则目标。

expression 遵循 SQLite 语法的字母数字值。

当与 rule-action 设置为 rename-schema 结合使用时,expression 参数指定一个新的架构。当与 rule-action 设置为 rename-table 结合使用时,expression 指定一个新表。当与 rule-action 设置为 rename-column 结合使用时,expression 指定一个新的列名值。

当与 rule-action 设置为 add-column 结合使用时,expression 指定构成新列的数据。

有关将表达式用于转换规则的更多信息,请参阅使用转换规则表达式定义列内容.

primary-key-def

一个带以下参数的对象:

  • name— 表或视图的新主键或唯一索引的名称。

  • (可选)origin— 要定义的唯一键的类型:primary-key(默认值)或unique-index.

  • columns— 一个字符串数组,它按照列在主键或唯一索引中出现的顺序列出列的名称。

此参数可以定义转换的表或视图上唯一键的名称、类型和内容。当 rule-action 设置为 define-primary-key 并且 rule-target 设置 table 为时,它执行此操作。默认情况下,将唯一键定义为主键。
before-image-def

一个带以下参数的对象:

  • column-prefix— 附加到列名称前面的值。原定设置值为 BI_

  • column-suffix— 附加到列名称后面的值。默认值为空。

  • column-filter— 需要以下值之一:pk-only(默认值)、non-lob(可选)和all(可选)。

此参数定义一个命名约定以标识之前映像列,并指定一个筛选条件以确定哪些源列可能在目标上具有为它们创建的之前映像列。当 rule-action 设置为 add-before-image-columns 并且 rule-target 设置为 column 时,您可以指定此参数。

不要同时将 column-prefixcolumn-suffix 设置为空字符串。

对于 column-filter,选择:

  • pk-only— 仅添加属于表主键一部分的列。

  • non-lob— 仅添加非 LOB 类型的列。

  • all— 添加具有之前映像值的任何列。

有关的映像前支持的更多信息Amazon DMS目标终端节点,请参阅:

示例

例 重命名架构

以下示例将架构从 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" } ] }

例 重命名表

以下示例将表从 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" } ] }

例 重命名列

以下示例将列从 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" } ] }

例 重命名 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" } ] }

例 重命名 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" } ] }

例 添加列

以下示例将 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 } } ] }

例 删除列

以下示例将转换源中名为 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%" } }] }

例 Convert to lowercase

以下示例将表名从 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" } }] }

例 转换为大写形式

以下示例将所有表和所有架构的所有列从小写形式(源中)转换为大写形式(目标中)。

{ "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": "%" } } ] }

例 添加前缀

以下示例转换源中的所有表,以便在目标中向这些表添加前缀 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_" }] }

例 替换前缀

以下示例将转换源中包含前缀 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_" } ] }

例 删除后缀

以下示例转换源中的所有表,以从目标中删除这些表的后缀 _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" }] }

例 定义主键

以下示例在迁移到目标终端节点的 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" ] } }] }

例 定义唯一索引

以下示例在迁移到目标终端节点的 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" ] } }] }

例 更改目标列的数据类型

以下示例将名为 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" } }

例 添加之前映像列

对于名为 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_no1 相应行中的列。

UPDATE employees SET emp_no = 3 WHERE emp_no = 1;

将 CDC 更新写入支持的 Amazon DMS 目标时,通过 BI_emp_no 列可以判断哪些行在 emp_no 列中具有更新的值。