在以下情形下,Data Mover 可复制视图数据:
- 在 Teradata 系统和 Teradata 表之间将基础数据从一个视图复制到另一个视图。
- 在 Teradata 和 Hadoop 之间将数据从一个视图复制到一个表。
copyData 属性为可选项,缺省值为 false。copyData 设置为 true 时,可以后跟可选的 view_data_table 元素。
如果未指定 view_data_table,Data Mover 会将视图数据复制到目标视图。必须指定 view selection = ”included” 元素以避免创建作业时出现异常。例如:
<views> <view selection="included" copyData="true"> <name>deptsals</name> <database>MyDb</database> </view> </views>在上面的示例中,会使用 "SELECT *from MyDb.deptSals" 选择视图 deptSals 中的数据,然后将这部分数据加载到目标系统中的视图 "MyDb"."deptSals"。如果目标系统中不存在 MyDB.deptSals 视图,将使用源视图定义创建该视图。如果目标系统中存在 MyDB.deptSals 视图,将使用源视图定义覆盖该视图。
如果指定了 view_data_table,则 target_table 用于指示要将基础视图数据复制到的表,target_database 用于指示目标表所在的数据库。如果目标系统中尚不存在该表,则 Data Mover 将创建该表。如果目标系统中已存在该表,则会将视图数据加载到该表中。例如:
<views> <view selection="included" copyData="true"> <name>deptsals</name> <database>MyDb</database> <view_data_table> <target_table>TargetTable</target_table> <target_database>TargetDb</target_database> </view_data_table> </view> </views>
在上面的示例中,将使用 "SELECT * from MyDb.deptSals" 选择视图 deptSals 中的数据并将其加载到表 "TargetDb"."TargetTable" 中。如果目标系统中不存在 "TargetDb"."TargetTable",则 Data Mover 将创建目标表。
Data Mover 创建目标表时,表具有以下特点:
- 是一个多重集表
- 具有与视图相同的列名和列类型
- 是一个无日志记录的非回退表
- 不包含二级索引
将视图数据复制到目标视图时,适用以下规则:
- 源视图引用的表不得超过一个。如果视图具有多个引用表,将发生运行时异常。
- 所有 compare_ddl 元素均将被忽略,因为 Data Mover 将使用源视图定义创建目标视图定义。
- 源视图引用的表必须存在于目标系统中,否则必须随作业一起移动。
将视图数据复制到目标视图时,会首先将源视图数据复制到目标暂存表,并使用源视图定义覆盖目标视图(如果存在目标视图的话)。然后,再将源视图数据从暂存表复制到目标视图。如果视图中不包含目标引用表的所有列,目标引用表有可能包含空值。因此,请谨慎使用此功能。
将视图数据复制到目标表或目标视图时,在使用加载实用程序方面适用以下规则:
- 如果未使用源暂存表,请勿将 ARC 或 DSA 用作加载实用程序。
- 复制视图数据时,如果指定 ARC 或 DSA(不使用源暂存表)或 TPTAPI_LOAD 作为 force_utility 的值,将导致创建时间错误。
- 除非将 force_utility 指定为 TPTAPI_STREAM、JDBC、DSA 或使用源暂存表的 ARC,否则将使用 TPTAPI_UPDATE 运算符复制视图数据。
- 将视图数据复制到 Hadoop 时,必须使用 T2H 并指定外部服务器。
- 与其他表一起复制视图数据时,将使用 TPTAPI_UPDATE 运算符复制视图数据,但可以使用 TPTAPI_LOAD 运算符复制其他数据表。当未指定 force_utility 值且未使用源暂存表时,或者指定 force_utility 值为 TPTAPI 时,就会发生这种情况。