

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

# 使用 從 Oracle 遷移至 Amazon RDS for PostgreSQL 或 Amazon Aurora PostgreSQL AWS Schema Conversion Tool
<a name="CHAP_Source.Oracle.ToPostgreSQL"></a>

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

**Topics**
+ [PostgreSQL 做為目標資料庫的權限](#CHAP_Source.Oracle.ToPostgreSQL.ConfigureTarget)
+ [Oracle 到 PostgreSQL 轉換設定](#CHAP_Source.Oracle.ToPostgreSQL.ConversionSettings)
+ [轉換 Oracle 序列](#CHAP_Source.Oracle.ToPostgreSQL.ConvertSequences)
+ [轉換 Oracle ROWID](#CHAP_Source.Oracle.ToPostgreSQL.ConvertRowID)
+ [轉換 Oracle 動態 SQL](#CHAP_Source.Oracle.ToPostgreSQL.DynamicSQL)
+ [轉換 Oracle 分割區](#CHAP_Source.Oracle.ToPostgreSQL.PG10Partitioning)

將 Oracle 系統物件轉換為 PostgreSQL 時， AWS SCT 執行轉換，如下表所示。


| Oracle 系統物件 | Description | 轉換後的 PostgreSQL 物件 | 
| --- | --- | --- | 
| V\$1VERSION  | 顯示 Oracle 資料庫中核心程式庫元件的版本編號 | aws\$1oracle\$1ext.v\$1version | 
| V\$1INSTANCE | 顯示目前執行個體狀態的檢視。 | aws\$1oracle\$1ext.v\$1instance | 

您可以使用 AWS SCT 將 Oracle SQL\$1Plus 檔案轉換為 psql，這是以終端機為基礎的前端，轉換為 PostgreSQL。如需詳細資訊，請參閱[使用 轉換應用程式 SQL AWS SCT](CHAP_Converting.App.md)。

## PostgreSQL 做為目標資料庫的權限
<a name="CHAP_Source.Oracle.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*。

若要使用 Amazon RDS for PostgreSQL 做為目標， AWS SCT 需要 `rds_superuser`權限。

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

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

## Oracle 到 PostgreSQL 轉換設定
<a name="CHAP_Source.Oracle.ToPostgreSQL.ConversionSettings"></a>

若要編輯 Oracle 至 PostgreSQL 轉換設定，請選擇 中的**設定** AWS SCT，然後選擇**轉換設定**。從上清單中，選擇 **Oracle**，然後選擇 **Oracle – PostgreSQL**。 AWS SCT 顯示 Oracle 到 PostgreSQL 轉換的所有可用設定。

中的 Oracle 到 PostgreSQL 轉換設定 AWS SCT 包含下列項目的選項：
+ 限制轉換程式碼中具有動作項目的註解數量。

  針對**所選嚴重性及更高層級之動作項目的轉換後程式碼中新增註解**，請選擇動作項目的嚴重性。針對所選嚴重性及更高層級的動作項目，在轉換後的程式碼中 AWS SCT 新增註解。

  例如，若要將已轉換程式碼中的註解數量降到最低，請選擇**僅限錯誤**。若要在已轉換的程式碼中包含所有動作項目的註解，請選擇**所有訊息**。
+ 允許 AWS SCT 將 Oracle 具體化視觀表轉換為 PostgreSQL 上的資料表或具體化視觀表。針對**具體化視觀表轉換為 **，選擇如何轉換來源具體化視觀表。
+ 在包含具有 PostgreSQL 不支援之參數的 `TO_CHAR`、 和 `TO_NUMBER`函數時`TO_DATE`，使用來源 Oracle 程式碼。根據預設， 會在轉換後的程式碼中 AWS SCT 模擬這些參數的使用情況。

  當您的來源 Oracle 程式碼僅包含 PostgreSQL 支援的參數時，您可以使用原生 PostgreSQL `TO_CHAR`、 `TO_DATE`和 `TO_NUMBER`函數。在此情況下，轉換後的程式碼運作得更快。若要僅包含這些參數，請選取下列值：
  + **函數 TO\$1CHAR() 不使用 Oracle 特定的格式字串**
  + **函數 TO\$1DATE() 不使用 Oracle 特定的格式字串**
  + **函數 TO\$1NUMBER() 不使用 Oracle 特定的格式字串**
+ 若要解決來源 Oracle 資料庫在`NUMBER`資料類型的主要或外部索引鍵資料欄中僅存放整數值的情況， AWS SCT 可以將這些資料欄轉換為 `BIGINT`資料類型。這種方法可以提高轉換後程式碼的性能。若要採取此方法，請選取**將 NUMBER 主要/外部索引鍵資料欄轉換為 BIGINT**。請確定您的來源未在這些資料行中包含浮點值，以避免資料遺失。
+ 略過原始程式碼中已停用的觸發和限制條件。若要這樣做，請選擇**忽略停用的觸發條件和限制**條件。
+ 使用 AWS SCT 轉換稱為動態 SQL 的字串變數。您的資料庫程式碼可以變更這些字串變數的值。若要確保 AWS SCT 一律轉換此字串變數的最新值，請選取**轉換在稱為常式中建立的動態 SQL 程式碼**。
+ 若要解決 PostgreSQL 第 10 版及更早版本不支援程序的問題。如果您或您的使用者不熟悉在 PostgreSQL 中使用程序， AWS SCT 可以將 Oracle 程序轉換為 PostgreSQL 函數。若要這樣做，請選取**將程序轉換為函數**。
+ 查看有關所發生動作項目的其他資訊。若要這麼做，您可以選取**新增例外狀況，針對下一個嚴重性層級的遷移問題引發封鎖，**將特定函數新增至延伸套件。然後選擇嚴重性層級，以引發使用者定義的例外狀況。
+ 使用可能包含自動產生名稱限制的來源 Oracle 資料庫。如果您的原始程式碼使用這些名稱，請務必選取**使用原始來源名稱轉換系統產生的限制名稱**。如果您的原始程式碼使用這些限制條件，但未使用其名稱，請清除此選項以增加轉換速度。
+ 處理資料庫和應用程式是否在不同時區執行。根據預設， 會在轉換後的程式碼中 AWS SCT 模擬時區。但是，當您的資料庫和應用程式使用相同的時區時，就不需要此模擬。在此情況下，請選取**用戶端的時區與伺服器上的時區相符**。
+ 處理來源和目標資料庫是否在不同時區執行。如果這樣做，模擬`SYSDATE`內建 Oracle 函數的函數會傳回與來源函數不同的值。若要確保您的來源和目標函數傳回相同的值，請選擇**設定 SYSDATE 模擬的預設時區**。
+ 在轉換後的程式碼中使用 Orafce 延伸中的函數。若要這樣做，請針對**使用 orafce 實作**，選取要使用的函數。如需有關 Orafce 的詳細資訊，請參閱 GitHub 上的 [Orafce](https://github.com/orafce/orafce)。

## 轉換 Oracle 序列
<a name="CHAP_Source.Oracle.ToPostgreSQL.ConvertSequences"></a>

AWS SCT 會將序列從 Oracle 轉換為 PostgreSQL。如果您使用序列來維護完整性限制，請確定已遷移序列的新值不會與現有值重疊。

**使用來源資料庫的最後一個值填入轉換後的序列**

1. 使用 Oracle 作為來源開啟您的 AWS SCT 專案。

1. 選擇**設定**，然後選擇**轉換設定**。

1. 從上方清單中選擇 **Oracle**，然後選擇 **Oracle – PostgreSQL**。 AWS SCT 會顯示 Oracle 到 PostgreSQL 轉換的所有可用設定。

1. 選擇**填入轉換後的序列，並在來源端產生最後一個值**。

1. 選擇**確定**以儲存設定，然後關閉**轉換設定**對話方塊。

## 轉換 Oracle ROWID
<a name="CHAP_Source.Oracle.ToPostgreSQL.ConvertRowID"></a>

 在 Oracle 資料庫中，ROWID 虛擬資料欄包含資料表列的地址。ROWID 虛擬資料欄對 Oracle 而言是唯一的，因此 會將 ROWID 虛擬資料欄 AWS SCT 轉換為 PostgreSQL 上的資料欄。透過使用此轉換，您可以保留 ROWID 資訊。

轉換 ROWID 虛擬資料欄時， AWS SCT 可以使用 資料類型建立`bigint`資料欄。如果沒有主索引鍵， 會將 ROWID 欄 AWS SCT 設定為主索引鍵。如果主索引鍵存在， 會 AWS SCT 設定具有唯一限制條件的 ROWID 資料欄。

如果您的來源資料庫程式碼包含使用 ROWID 的操作，而 ROWID 無法使用數值資料類型執行， AWS SCT 則可以使用 `character varying`資料類型建立資料欄。

**為專案的 Oracle ROWID 建立資料欄**

1. 使用 Oracle 作為來源開啟您的 AWS SCT 專案。

1. 選擇**設定**，然後選擇**轉換設定**。

1. 從上方清單中選擇 **Oracle**，然後選擇 **Oracle – PostgreSQL**。 AWS SCT 會顯示 Oracle 到 PostgreSQL 轉換的所有可用設定。

1. 對於**產生資料列 ID**，請執行下列其中一項操作：
   + 選擇**產生身分**以建立數值資料欄。
   + 選擇**產生為字元網域類型**以建立字元資料欄。

1. 選擇**確定**以儲存設定，然後關閉**轉換設定**對話方塊。

## 轉換 Oracle 動態 SQL
<a name="CHAP_Source.Oracle.ToPostgreSQL.DynamicSQL"></a>

 Oracle 提供兩種方式來實作動態 SQL：使用 EXECUTE IMMEDIATE 陳述式或在 DBMS\$1SQL 套件中呼叫程序。如果您的來源 Oracle 資料庫包含具有動態 SQL 的物件，請使用 AWS SCT 將 Oracle 動態 SQL 陳述式轉換為 PostgreSQL。

**將 Oracle 動態 SQL 轉換為 PostgreSQL**

1. 使用 Oracle 作為來源開啟您的 AWS SCT 專案。

1. 選擇在 Oracle 來源樹狀檢視中使用動態 SQL 的資料庫物件。

1. 開啟物件的內容 （按一下滑鼠右鍵） 選單，選擇**轉換結構描述**，並同意在物件存在時取代物件。下列螢幕擷取畫面顯示使用動態 SQL 的 Oracle 程序下方的轉換程序。  
![\[動態 SQL 轉換\]](http://docs.aws.amazon.com/zh_tw/SchemaConversionTool/latest/userguide/images/dynamicsql1.png)

## 轉換 Oracle 分割區
<a name="CHAP_Source.Oracle.ToPostgreSQL.PG10Partitioning"></a>

AWS SCT 目前支援下列分割方法：
+ 範圍
+ 清單
+ 多欄範圍
+ 雜湊
+ 複合 （清單、範圍清單、清單範圍、清單雜湊、範圍雜湊、雜湊雜湊）