使用转换规则表达式定义列内容 - Amazon Database Migration Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

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

使用转换规则表达式定义列内容

要定义新列和现有列的内容,可以在转换规则中使用表达式。例如,使用表达式,您可以添加列或将源表标头复制到目标。您还可以使用表达式将目标表上的记录标记为在源中插入、更新或删除。

使用表达式添加列

要使用转换规则中的表达式向表添加列,请使用 add-column 规则操作和 column 规则目标。

以下示例将新列添加到 ITEM 表中。它将新列名称设置为 FULL_NAME,数据类型为 string,长度为 50 个字符。此表达式连接两个现有列 LAST_NAMEFIRST_NAME 的值,以便计算结果为 FULL_NAME。这些区域有:schema-nametable-name,表达式参数是指源数据库表中的对象。Valuedata-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 } } ] }

使用表达式标记目标记录

要将目标表中的记录标记为在源表中插入、更新或删除,请在转换规则中使用表达式。表达式使用 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 } }

使用表达式复制源表标头

默认情况下,源表的标头不会复制到目标。要指示要复制哪些标头,请将转换规则与包含表列标头的表达式结合使用。

您可以在表达式中使用以下列标头。

标头 正在进行的复制中的值 完全加载中的值 数据类型
AR_H_STREAM_位置 来自源的流位置值。此值可能是系统更改号 (SCN) 或日志序列号 (LSN),具体取决于源终端节点。 空字符串。 STRING
AR_H_时间戳 指示更改时间的时间戳。 指示当前数据到达目标的时间戳。 日期时间(scale=7)
AR_H_COMMIT_时间戳 指示提交时间的时间戳。 指示当前时间的时间戳。 日期时间(scale=7)
AR_H_操作 INSERT、UPDATE 或 DELETE INSERT STRING
AR_H_USER 源提供的有关进行更改的用户的用户名、ID 或任何其他信息。

此标头仅在 SQL Server 和 Oracle(版本 11.2.0.3 及更高版本)源终端节点上受到支持。

要应用于对象的转换。转换规则操作区分大小写。 STRING
AR_H_CHANGE_SEQ 源数据库中的唯一递增数字,由时间戳和 auto 递增数字组成。值取决于源数据库系统。 空字符串。 STRING

以下示例通过使用源中的流位置值向目标添加新列。对于 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 递增的记录/id 号。

{ "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 函数构建表达式

您可以使用表设置指定要应用于指定操作的选定表或视图的任何设置。表设置规则是可选的。

注意

MongoDB 和 DocumentDB 数据库不是表和视图的概念,而是将数据记录存储为收集在中的文档集合. 因此,从 MongoDB 或 DocumentDB 源迁移时,请考虑选定的 parallel 加载设置的范围分段类型集合而不是表格和视图。

在下文中,您可以找到可用于构建转换规则表达式的字符串函数。

字符串函数 描述

lower(x)

这些区域有:lower(x)函数返回字符串的副本x将所有字符转换为小写。默认值,内置lower函数仅适用于 ASCII 字符。

ltrim(x,y)

这些区域有:ltrim(x,y)函数返回一个通过从 x 的左侧删除 y 中出现的所有字符而形成的字符串。如果 y 没有价值,ltrim(x)从 x 左侧删除空格。

replace(x,y,z)

这些区域有:replace(x,y,z)函数返回一个由字符串 z 替换字符串 z 来形成的字符串 x 中每次出现的字符串 y。

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)返回字符串末尾的所有字符xy第一个角色。最左边的角色x编号为 1。如果y为负数,子字符串的第一个字符是通过从右边而不是左边计数来找到的。如果z是负面的,那么abs(z)之前的字符y返回该字符。如果x是字符串,那么字符的索引指的是实际的 UTF-8 字符。如果x是 BLOB,那么索引指的是字节。

trim(x,y)

这些区域有:trim(x,y)函数返回一个通过删除中出现的所有字符形成的字符串y来自两边x. 如果没有价值ytrim(x)从两侧删除空格x.

replaceChars(X,Y,Z)

这些区域有:replaceChars(X,Y,Z)函数替换字符串中的任何字符X也存在于字符串中Y(要替换的字符)Z(替换字符)位于同一位置。此函数对于从路径和文件名中删除无效的字符特别有用。

如果字符串Z不包括在字符串中具有相应位置的字符X,那个字符串X字符被字符串中的第一个字符替换Z.

如果字符串X包含字符串中不存在的字符串中Z,原始角色保持不变。

例如,指定replaceChars("abcde","abcd","123")回报1231e.

在下文中,您可以找到可用于构建转换规则表达式的 LOB 函数。

LOB 函数 描述

hex(x)

这些区域有:hex函数接收 BLOB 作为参数,并返回 BLOB 内容的大写十六进制字符串版本。

randomblob (N)

这些区域有:randomblob(N)函数返回N-byte BLOB,包含伪随机字节。如果N小于 1,返回 1 字节随机 BLOB。

zeroblob(N)

这些区域有:zeroblob(N)函数返回一个 BLOB,该 BLOB 包括N字节为 0x00。

在下文中,您可以找到可用于构建转换规则表达式的数字函数。

数字函数 描述

abs(x)

这些区域有:abs(x)函数返回数值参数的绝对值x. 这些区域有:abs(x)如果函数返回 NULLxNULL 为空。这些区域有:abs(x)如果函数返回 0.0x是无法转换为数字值的字符串或 BLOB。

random()

这些区域有:random函数返回介于 -9,223,372,036,854,775,808 和 +9,223,372,036,854,775,807 之间的伪随机整数。

round (x,y)

这些区域有:round (x,y)函数返回一个浮点值。x四舍五入到y小数点右侧的数字。如果没有价值y,假设为 0。

max (x,y...)

多参数max函数返回具有最大值的参数,如果任何参数为 NULL,则返回 NULL。

这些区域有:max函数从左到右搜索其参数,以查找定义整理函数的参数。如果找到一个,它会使用该整理函数进行所有字符串比较。如果没有任何参数max定义一个整理函数,BINARY使用了整理功能。这些区域有:max函数在有两个或更多参数时是一个简单的函数,但如果有一个参数,它将作为聚合函数运行。

min (x,y...)

多参数min函数返回具有最小值的参数。

这些区域有:min函数从左到右搜索其参数,以查找定义整理函数的参数。如果找到一个,它会使用该整理函数进行所有字符串比较。如果没有任何参数min定义一个整理函数,BINARY使用了整理功能。这些区域有:min函数在有两个或更多参数时是一个简单的函数,但如果有一个参数,它将作为聚合函数运行。

在下文中,您可以找到可用于构建转换规则表达式的 NULL 检查函数。

NULL 检查函数 描述

coalesce (x,y...)

这些区域有:coalesce函数返回其第一个非 NULL 参数的副本,但如果所有参数都为 NULL,则返回 NULL。结合函数至少包含两个参数。

ifnull(x,y)

这些区域有:ifnull函数返回其第一个非 NULL 参数的副本,但如果两个参数都为 NULL,则返回 NULL。这些区域有:ifnull函数正好有两个参数。这些区域有:ifnull函数与coalesce包含两个参数。

nullif(x,y)

这些区域有:nullif(x,y)如果参数不同,函数返回其第一个参数的副本,但如果参数相同,则返回 NULL。

这些区域有:nullif(x,y)函数从左到右搜索其参数,以查找定义整理函数的参数。如果找到一个,它会使用该整理函数进行所有字符串比较。如果 null lif 的参数都不定义整理函数,那么BINARY使用了整理功能。

在下文中,您可以找到可用于构建转换规则表达式的日期和时间函数。

日期和时间函数 描述

date(timestring, modifier, modifier...)

这些区域有:date函数以 YYYYY-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: ** 小数秒 SS.SSS

%j: 001—366 年中的第一天

%J: ** 朱利安日数

%m: 01—12 个月

%M分钟数 00—59

%s:1970 年 1 月 1 日以来的秒数

%S: 秒数 00—59

%w: 星期天 0—6 周日 ==0

%W: 00—53 年中的一周

%Y: 0000—9999 年

%%: %

在下文中,您可以找到可用于构建转换规则表达式的哈希函数。

哈希函数 描述

hash_sha256(x)

这些区域有:hash函数为输入列生成哈希值(使用 SHA-256 算法)并返回生成的哈希值的十六进制值。

使用hash表达式中的函数,添加hash_sha256(x)转到表达式并替换x使用源列名称。

使用 CASE 表达式

SQLiteCASE表达式评估条件列表并根据结果返回表达式。语法如下所示。

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

示例

例 使用 case 条件向目标表添加新的字符串列

以下示例转换规则添加了一个新的字符串列,emp_seniority在目标表上,employee. 它使用 SQLiteround工资栏上的函数,具有案例条件来检查工资是否等于还是超过 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 } }

例 向目标表添加新的日期列

以下示例添加一个新的日期列,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 } }

例 向目标表添加新的数字列

以下示例添加一个新的数字列,rounded_emp_salary在目标表上,employee. 它使用 SQLiteround函数来添加四舍五入的薪水。

{ "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" } }

例 使用哈希函数向目标表添加新的字符串列

以下示例添加一个新的字符串列,hashed_emp_number在目标表上,employee. SQLitehash_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": 50 } }

使用表达式向目标表添加元数据

可以使用以下表达式将元数据信息添加到目标表中:

  • $AR_M_SOURCE_SCHEMA— 源架构的名称。

  • $AR_M_SOURCE_TABLE_NAME— 源表的名称。

  • $AR_M_SOURCE_COLUMN_NAME— 源表中的列的名称。

  • $AR_M_SOURCE_COLUMN_DATATYPE— 源表中的列的数据类型。

例 使用源中的架构名称为架构名称添加列

以下示例添加了名为的新列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 } }