

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

# 从 DB2 适用于 Linux、UNIX 和 Windows 的 IBM 迁移到适用于 PostgreSQL 的亚马逊关系数据库服务或兼容亚马逊 Aurora PostgreSQL 的版本
<a name="CHAP_Source.DB2LUW.ToPostgreSQL"></a>

当你将 IBM Db2 LUW 迁移到 PostgreSQL 时， AWS SCT 可以转换与 Db2 LUW 一起使用的各种触发语句。这些触发语句包括以下内容：
+ **触发事件** - INSERT、DELETE 和 UPDATE 触发事件指定触发的操作将在事件应用于主题表或主题视图时运行。您可以指定 INSERT、DELETE 和 UPDATE 事件的任意组合，但每个事件只能指定一次。 AWS SCT 支持单个和多个触发事件。对于事件，PostgreSQL 几乎具有相同的功能。
+ **事件 OF COLUMN**：可通过基表指定列名称。仅当更新列名称列表中标识的列时才会激活此触发器。PostgreSQL 具有相同的功能。
+ **语句触发器**：这些触发器指定仅对整个语句应用触发的操作一次。不能为 BEFORE 触发器或 INSTEAD OF 触发器指定此类型的触发器粒度。如果指定，则将激活 UPDATE 或 DELETE 触发器，即使不影响任何行也是如此。PostgreSQL 也具有此功能，并且 PostgreSQL 和 Db2 LUW 的语句触发器的触发声明是相同的。
+ **引用子句**：这些子句指定转换变量的相关性名称和转换表的表名称。相关性名称标识通过触发 SQL 操作影响的行集中的特定行。表名称标识受影响行的完整集。通过触发 SQL 操作影响的每行可用于通过使用指定相关性名称限定列触发的操作。PostgreSQL 不支持此功能，并且仅使用 NEW 或 OLD 相关性名称。
+ **INSTEAD OF 触发器**： AWS SCT 支持这些触发器。

## 将 Db2 LUW 分区表转换为 PostgreSQL 版本 10 分区表
<a name="CHAP_Source.DB2LUW.ToPostgreSQL.PartitionedTables"></a>

AWS SCT 可以在 PostgreSQL 10 中将 Db2 LUW 表转换为分区表。在将 Db2 LUW 分区表转换为 PostgreSQL 时，存在一些限制：
+ 可在 Db2 LUW 中创建具有可为空的列的分区表，并指定用于存储 NULL 值的分区。但是，PostgreSQL 不支持 RANGE 分区采用 NULL 值。
+ Db2 LUW 可以使用 INCLUSIVE 或 EXCLUSIVE 子句来设置范围边界值。PostgreSQL 仅支持 INCLUSIVE 用于开始边界，EXCLUSIVE 用于结束边界。转换的分区名称的格式为 <original\_table\_name>\_<original\_partition\_name>。
+ 在 Db2 LUW 中，可为分区表创建主键或唯一键。PostgreSQL 需要您直接为每个分区创建主键或唯一键。必须从父表中删除主键或唯一键约束。转换的键名称的格式为 <original\_key\_name>\_<original\_partition \_name>。
+ 在 Db2 LUW 中，您可以创建进出分区表的外键约束。但是，PostgreSQL 不支持分区表中的外键引用。此外，PostgreSQL 也不支持从一个分区表到另一个表的外键引用。
+ 在 Db2 LUW 中，您可以在分区表上创建索引。但是，PostgreSQL 需要您直接为每个分区创建索引。必须从父表删除索引。转换的索引名称的格式为 <original\_index\_name>\_<original\_partition\_name>。
+ 您必须针对单个分区而不是分区表定义行触发器。必须从父表删除触发器。转换的触发器名称的格式为 <original\_trigger\_name>\_<original\_partition\_name>。

## 将 PostgreSQL 用作目标的权限
<a name="CHAP_Source.DB2LUW.ToPostgreSQL.ConfigureTarget"></a>

要使用 PostgreSQL 作为目标 AWS SCT ，需要权限。`CREATE ON DATABASE`请确保为每个目标 PostgreSQL 数据库授予此权限。

要使用转换后的公共同义词，请将数据库的默认搜索路径更改为 `"$user", public_synonyms, public`。

您可以使用以下代码示例创建数据库用户并授予权限。

```
CREATE ROLE {{user_name}} LOGIN PASSWORD '{{your_password}}';
GRANT CREATE ON DATABASE {{db_name}} TO {{user_name}};
ALTER DATABASE {{db_name}} SET SEARCH_PATH = "$user", public_synonyms, public;
```

在前面的示例中，{{user\_name}}使用您的用户名替换。然后，{{db\_name}}替换为目标数据库的名称。最后，{{your\_password}}替换为安全密码。

在 PostgreSQL 中，只有架构所有者或 `superuser` 才能删除架构。即使架构的所有者并不拥有架构的某些对象，该所有者也可以删除该架构及其包含的所有对象。

当你使用不同的用户转换不同的架构并将其应用到目标数据库时，当无法删除架构时，你 AWS SCT 可能会收到一条错误消息。要避免出现此错误消息，请使用 `superuser` 角色。