

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 從適用於 Linux、UNIX 和 Windows 的 IBM DB2 遷移至 Amazon Relational Database Service for PostgreSQL 或 Amazon 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 有幾乎相同的功能。
+ **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 可以將 Db2 LUW 資料表轉換為 PostgreSQL 10 中的分割資料表。在將 Db2 LUW 分割資料表轉換到 PostgreSQL 時，有多種限制：
+ 您可在 Db2 LUW 中以 NULL 欄建立分割資料表，並可以指定一個分割區來存放 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>。
+ 您必須在個別分割區上定義 row 觸發器，而非在分割資料表上定義。必須從父資料表移除觸發器。轉換後的觸發器名稱格式為 <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` 角色。