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

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

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

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

使用表达式添加列

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

以下示例将新列添加到 ITEM 表中。它将新列名称设置为 FULL_NAME,数据类型为 string,长度为 50 个字符。此表达式连接两个现有列 LAST_NAMEFIRST_NAME 的值,以便计算结果为 FULL_NAME。的schema-nametable-name,而表达式参数是指源数据库表中的对象。Value还有data-typeblock 引用目标数据库表中的对象。

{ "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_indicatorfunction 仅适用于源数据库和目标数据库上均有主键的表。

例如,以下转换规则首先将新的 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_POSITION 来自源的流位置值。此值可能是系统更改号 (SCN) 或日志序列号 (LSN),具体取决于源终端节点。 空字符串。 STRING
AR_H_TIMESTAMP 指示更改时间的时间戳。 一个时间戳,表示当前数据到达目标的时间。 日期时间(比例=7)
AR_H_COMMIT_TIMESTAMP 指示提交时间的时间戳。 指示当前时间的时间戳。 日期时间(比例=7)
AR_H_OPERATION INSERT、UPDATE 或 DELETE INSERT STRING
AR_H_USER 源提供的有关进行更改的用户的用户名、ID 或任何其他信息。

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

要应用于对象的转换。转换规则操作区分大小写。 STRING
AR_H_CHANGE_SEQ 源数据库中唯一的递增数字,由时间戳和自动递增的数字组成。该值取决于源数据库系统。 空字符串。 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 递增的 record_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 源迁移时,请考虑所选并行加载设置的范围分段类型集合而不是表格和视图。

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

字符串函数 描述

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)函数返回一个字符串,该字符串由字符串 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第 n 个字符,哪个是z字符长。

如果z被省略,substr(x,y)返回字符串末尾的所有字符xy第 1 个字符。最左边的字符x是数字 1。如果y为负数,则子字符串的第一个字符是通过从右计数而不是从左开始计数来找到的。如果z为负数,那么abs(z)前面的字符y将返回字符。如果x是一个字符串,则字符的索引指的是实际的 UTF-8 字符。如果x是一个 BLOB,那么索引指的是字节。

trim(x,y)

trim(x,y)函数返回一个通过删除所有出现在中的字符而形成的字符串y从两边x。如果没有价值ytrim(x)移除两边的空格x

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

LOB 函数 描述

hex(x)

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

randomblob (N)

randomblob(N)函数返回N-byte BLOB,其中包含伪随机字节。如果N小于 1,则返回一个 1 字节的随机 BLOB。

zeroblob(N)

zeroblob(N)函数返回一个由以下内容组成的 BLOBN0x00 的字节。

接下来,您可以找到可用于构建转换规则表达式的数值函数。

数值函数 描述

abs(x)

abs(x)函数返回数字参数的绝对值x。的abs(x)如果出现以下情况,则函数返回x为空。的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。

maxfunction 从左到右搜索其参数,寻找定义整理函数的参数。如果找到一个,它就会使用该整理函数进行所有字符串比较。如果没有一个参数max定义一个整理函数,BINARY使用了整理功能。的max当它有两个或更多参数时,function 是一个简单的函数,但是如果它只有一个参数,它就会作为聚合函数运行。

min (x,y...)

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

minfunction 从左到右搜索其参数,寻找定义整理函数的参数。如果找到一个,它就会使用该整理函数进行所有字符串比较。如果没有一个参数min定义一个整理函数,BINARY使用了整理功能。的min当它有两个或更多参数时,function 是一个简单的函数,但是如果它只有一个参数,它就会作为聚合函数运行。

接下来,您可以找到可用于构建转换规则表达式的 NULL 校验函数。

空值校验函数 描述

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)function 从左到右搜索其参数,寻找定义整理函数的参数。如果找到一个,它就会使用该整理函数进行所有字符串比较。如果 nullif 的参数都没有定义整理函数,那么BINARY使用了整理功能。

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

日期和时间函数 描述

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: ** 小数秒 SS.SSS

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

%J: ** 朱利安日数

%m: 第 01—12 个月

%M: 分钟 00—59

%s: 自 1970-01-01 以来的秒数

%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 表达式

SQLiteCASEexpression 计算条件列表并根据结果返回表达式。语法如下所示。

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

示例

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

以下示例转换规则添加了一个新的字符串列,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": 64 } }

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

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

  • $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 } }