

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

# ConnConnecting連線至適用於 Linux、UNIX 和 Windows 資料庫的 IBM DB2 AWS Schema Conversion Tool
<a name="CHAP_Source.DB2LUW"></a>

您可以使用 AWS SCT 將結構描述、SQL 語言中的程式碼物件，以及適用於 Linux、Unix 和 Windows 的 IBM Db2 應用程式碼 (Db2 LUW) 轉換為下列目標。
+ Amazon RDS for MySQL
+ Amazon Aurora MySQL-Compatible Edition
+ Amazon RDS for PostgreSQL
+ Amazon Aurora PostgreSQL-Compatible Edition
+ Amazon RDS for MariaDB

AWS SCT 支援 作為來源 Db2 LUW 9.1、9.5、9.7、10.1、10.5、11.1 和 11.5 版。

## 做為來源的 Db2 LUW 權限
<a name="CHAP_Source.DB2LUW.Permissions"></a>

連線至 Db2 LUW 資料庫、檢查來源的可用權限和讀取結構描述中繼資料所需的權限如下：
+ 建立連線所需要的權限：
  + 在資料庫上連線
+ 執行 SQL 陳述式所需要的權限：
  + 在 PACKAGE NULLID.SYSSH200上執行
+ 取得執行個體層級資訊所需要的權限：
  + 在函數 SYSPROC.ENV\$1GET\$1INST\$1INFO 上執行
  + 在 SYSIBMADM.ENV\$1INST\$1INFO 上選取
  + 在 SYSIBMADM.ENV\$1SYS\$1INFO 上選取
+ 檢查透過角色、群組和機構授予權限所需要的權限：
  + 在函數 SYSPROC.AUTH\$1LIST\$1AUTHORITIES\$1FOR\$1AUTHID 上執行
  + 在函數 SYSPROC.AUTH\$1LIST\$1GROUPS\$1FOR\$1AUTHID 上執行
  + 在函數 SYSPROC.AUTH\$1LIST\$1ROLES\$1FOR\$1AUTHID 上執行
  + 在 SYSIBMADM.PRIVILEGES 上選取
+ 系統目錄和表格所需要的權限：
  + 在 SYSCAT.ATTRIBUTES 上選取
  + SELECT ON SYSCAT.CHECKS
  + 在 SYSCAT.COLIDENTATTRIBUTES 上選取
  + SELECT ON SYSCAT.COLUMNS
  + 在 SYSCAT.DATAPARTITIONEXPRESSION 上選取
  + 在 SYSCAT.DATAPARTITIONS 上選取
  + 在 SYSCAT.DATATYPEDEP 上選取
  + 在 SYSCAT.DATATYPES 上選取
  + 在 SYSCAT.HIERARCHIES 上選取
  + 在 SYSCAT.INDEXCOLUSE 上選取
  + SELECT ON SYSCAT.INDEXES
  + 在 SYSCAT.INDEXPARTITIONS 上選取
  + 在 SYSCAT.KEYCOLUSE 上選取
  + 在 SYSCAT.MODULEOBJECTS 上選取
  + SELECT ON SYSCAT.MODULES
  + 在 SYSCAT.NICKNAMES 上選取
  + SELECT ON SYSCAT.PERIODS
  + 在 SYSCAT.REFERENCES 上選取
  + 在 SYSCAT.ROUTINEPARMS 上選取
  + SELECT ON SYSCAT.ROUTINES
  + 在 SYSCAT.ROWFIELDS 上選取
  + SELECT ON SYSCAT.SCHEMATA
  + 在 SYSCAT.SEQUENCES 上選取
  + SELECT ON SYSCAT.TABCONST
  + SELECT ON SYSCAT.TABLES
  + SELECT ON SYSCAT.TRIGGERS
  + 在 SYSCAT.VARIABLEDEP 上選取
  + 在 SYSCAT.VARIABLES 上選取
  + SELECT ON SYSCAT.VIEWS
  + 在 SYSIBM.SYSDUMMY1 上選取
+  若要執行 SQL 陳述式，使用者帳戶需要能使用資料庫內已啟用的至少一個工作負載的權限。如果沒有指派工作負載給使用者，請確定使用者能存取預設的使用者工作負載：
  + 工作負載 SYSDEFAULTUSERWORKLOAD 上的 用量

若要執行查詢，您需要建立頁面大小 8K、16K 和 32K 的系統臨時資料表空間 (如果這些不存在)。若要建立臨時資料表空間，請執行下列指令碼。

```
CREATE BUFFERPOOL BP8K
  IMMEDIATE
  ALL DBPARTITIONNUMS
  SIZE AUTOMATIC
  NUMBLOCKPAGES 0
  PAGESIZE 8K;
  
CREATE SYSTEM TEMPORARY TABLESPACE TS_SYS_TEMP_8K 
  PAGESIZE 8192 
  BUFFERPOOL BP8K;
  
CREATE BUFFERPOOL BP16K
  IMMEDIATE
  ALL DBPARTITIONNUMS
  SIZE AUTOMATIC
  NUMBLOCKPAGES 0
  PAGESIZE 16K;
  
CREATE SYSTEM TEMPORARY TABLESPACE TS_SYS_TEMP_BP16K 
  PAGESIZE 16384 
  BUFFERPOOL BP16K;  
  
CREATE BUFFERPOOL BP32K
  IMMEDIATE
  ALL DBPARTITIONNUMS
  SIZE AUTOMATIC
  NUMBLOCKPAGES 0
  PAGESIZE 32K;
  
CREATE SYSTEM TEMPORARY TABLESPACE TS_SYS_TEMP_BP32K 
  PAGESIZE 32768 
  BUFFERPOOL BP32K;
```

## 以來源身分連線至 Db2 LUW
<a name="CHAP_Source.DB2LUW.Connecting"></a>

使用以下程序，透過 AWS Schema Conversion Tool連接到您的 Db2 LUW 來源資料庫。

**連接到 Db2 LUW 來源資料庫**

1. 在 中 AWS Schema Conversion Tool，選擇**新增來源**。

1. 選擇 **Db2 LUW**，然後選擇**下一步**。

   新增**來源**對話方塊隨即出現。

1. 在**連線名稱**中，輸入資料庫的名稱。 會在左側面板的樹狀目錄中 AWS SCT 顯示此名稱。

1. 使用來自 的資料庫登入資料 AWS Secrets Manager 或手動輸入：
   + 若要從 Secrets Manager 使用資料庫登入資料，請使用下列指示：

     1. 針對**AWS 秘密**，選擇秘密的名稱。

     1. 選擇**填入**，從 Secrets Manager 自動填入資料庫連線對話方塊中的所有值。

     如需從 Secrets Manager 使用資料庫登入資料的資訊，請參閱 [在 AWS Secrets Manager 中設定 AWS Schema Conversion Tool](CHAP_UserInterface.SecretsManager.md)。
   + 若要手動輸入 IBM Db2 LUW 來源資料庫連線資訊，請使用下列指示：  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/SchemaConversionTool/latest/userguide/CHAP_Source.DB2LUW.html)

1. 選擇**測試連線**以驗證 AWS SCT 可以連接到您的來源資料庫。

1. 選擇**連線**以連線至來源資料庫。

# 從適用於 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\$1table\$1name>\$1<original\$1partition\$1name>。
+ 您可在 Db2 LUW 中建立分割資料表的主要或唯一索引鍵。PostgreSQL 要求您為每個分割區直接建立主要或唯一索引鍵。必須從父資料表中移除主要或唯一索引鍵限制。轉換後的金鑰名稱格式為 <original\$1key\$1name>\$1<original\$1partition \$1name>。
+ 您可在 Db2 LUW 中從分割資料表建立外部索引鍵限制，以及對分割資料表建立外部索引鍵限制。但是，PostgreSQL 不支援在分割資料表中的外部索引鍵參考。PostgreSQL 也不支援從一個分割資料表參考另一個資料表的外部索引鍵。
+ 您可以在 Db2 LUW 中的分割資料表上建立索引。但是，PostgreSQL 要求您為每個分割區直接建立索引。必須從父資料表移除索引。轉換後的索引名稱格式為 <original\$1index\$1name>\$1<original\$1partition\$1name>。
+ 您必須在個別分割區上定義 row 觸發器，而非在分割資料表上定義。必須從父資料表移除觸發器。轉換後的觸發器名稱格式為 <original\$1trigger\$1name>\$1<original\$1partition\$1name>。

## 將 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\$1name* 替換為您的使用者名稱。然後，將 *db\$1name* 取代為目標資料庫的名稱。最後，使用安全密碼取代 *your\$1password*。

在 PostgreSQL 中，只有結構描述擁有者或 `superuser` 可以刪除結構描述。擁有者可以捨棄結構描述和此結構描述包含的所有物件，即使結構描述的擁有者不擁有其部分物件。

當您使用不同的使用者來轉換和套用不同的結構描述到目標資料庫時，當 AWS SCT 無法捨棄結構描述時，您可能會收到錯誤訊息。若要避免此錯誤訊息，請使用 `superuser` 角色。

# 從適用於 Linux、UNIX 和 Windows 的 IBM DB2 遷移至 Amazon RDS for MySQL 或 Amazon Aurora MySQL
<a name="CHAP_Source.DB2LUW.ToMySQL"></a>

當您將 IBM Db2 LUW 資料庫轉換為 RDS for MySQL 或 Amazon Aurora MySQL 時，請注意下列事項。

## 將 MySQL 作為目標的權限
<a name="CHAP_Source.DB2LUW.ToMySQL.ConfigureTarget"></a>

MySQL 做為目標所需的權限如下：
+ CREATE ON \$1.\$1
+ ALTER ON \$1.\$1
+ DROP ON \$1.\$1
+ INDEX ON \$1.\$1
+ 參考開啟 \$1.\$1
+ SELECT ON \$1.\$1
+ 在 \$1.\$1 上建立檢視
+ SHOW VIEW ON \$1.\$1
+ 觸發開啟 \$1.\$1
+ CREATE ROUTINE ON \$1.\$1
+ ALTER ROUTINE ON \$1.\$1
+ EXECUTE ON \$1.\$1
+ SELECT ON mysql.proc
+ INSERT，更新 AWS\$1DB2\$1EXT.\$1
+ 在 AWS\$1DB2\$1EXT\$1DATA 上插入、更新、刪除。\$1
+ 在 AWS\$1DB2\$1EXT\$1DATA 上建立暫存資料表。\$1

您可以使用下列程式碼範例來建立資料庫使用者並授與權限。

```
CREATE USER 'user_name' IDENTIFIED BY 'your_password';
GRANT CREATE ON *.* TO 'user_name';
GRANT ALTER ON *.* TO 'user_name';
GRANT DROP ON *.* TO 'user_name';
GRANT INDEX ON *.* TO 'user_name';
GRANT REFERENCES ON *.* TO 'user_name';
GRANT SELECT ON *.* TO 'user_name';
GRANT CREATE VIEW ON *.* TO 'user_name';
GRANT SHOW VIEW ON *.* TO 'user_name';
GRANT TRIGGER ON *.* TO 'user_name';
GRANT CREATE ROUTINE ON *.* TO 'user_name';
GRANT ALTER ROUTINE ON *.* TO 'user_name';
GRANT EXECUTE ON *.* TO 'user_name';
GRANT SELECT ON mysql.proc TO 'user_name';
GRANT INSERT, UPDATE ON AWS_DB2_EXT.* TO 'user_name';
GRANT INSERT, UPDATE, DELETE ON AWS_DB2_EXT_DATA.* TO 'user_name';
GRANT CREATE TEMPORARY TABLES ON AWS_DB2_EXT_DATA.* TO 'user_name';
```

在上述範例中，請將 *user\$1name* 替換為您的使用者名稱。然後，將 *your\$1password* 替換為一個安全的密碼。

若要使用 Amazon RDS for MySQL 或 Aurora MySQL 作為目標，請將 `lower_case_table_names` 參數設定為 `1`。此值意味著 MySQL 服務器在處理資料表、索引、觸發程式和資料庫等對象名稱的識別碼時不區分大小寫。如果您已在目標執行個體中開啟二進位記錄功能，請將 `log_bin_trust_function_creators` 參數設定為 `1`。在這種情況下，您不需要使用 `DETERMINISTIC`、`READS SQL DATA` 或 `NO SQL` 特性來建立已儲存的函數。若要設定這些參數，請建立新的參數群組，或是修改現有的資料庫參數群組。