

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

# 使用 從 SQL Server 遷移至 PostgreSQL AWS Schema Conversion Tool
<a name="CHAP_Source.SQLServer.ToPostgreSQL"></a>

您可以在其中使用 SQL Server 到 PostgreSQL 延伸套件 AWS SCT。此延伸套件會在轉換後的 PostgreSQL 程式碼中模擬 SQL Server 資料庫函數。使用 SQL Server 到 PostgreSQL 延伸套件來模擬 SQL Server Agent 和 SQL Server Database Mail。如需詳細了解延伸套件，請參閱：[搭配 使用延伸套件 AWS Schema Conversion Tool](CHAP_ExtensionPack.md)。

**Topics**
+ [PostgreSQL 做為目標資料庫的權限](#CHAP_Source.SQLServer.ToPostgreSQL.ConfigurePostgreSQL)
+ [SQL 伺服器到 PostgreSQL 轉換設定](#CHAP_Source.SQLServer.ToPostgreSQL.ConversionSettings)
+ [將 SQL Server 分割區轉換為 PostgreSQL 第 10 版分割區](#CHAP_Source.SQLServer.ToPostgreSQL.PG10Partitions)
+ [遷移考量事項](#CHAP_Source.SQLServer.ToPostgreSQL.MigrationConsiderations)
+ [使用 AWS SCT 延伸套件模擬 PostgreSQL 中的 SQL Server Agent](CHAP_Source.SQLServer.ToPostgreSQL.ExtensionPack.Agent.md)
+ [使用 AWS SCT 延伸套件模擬 PostgreSQL 中的 SQL Server 資料庫郵件](CHAP_Source.SQLServer.ToPostgreSQL.ExtensionPack.Mail.md)

## PostgreSQL 做為目標資料庫的權限
<a name="CHAP_Source.SQLServer.ToPostgreSQL.ConfigurePostgreSQL"></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` 角色。

## SQL 伺服器到 PostgreSQL 轉換設定
<a name="CHAP_Source.SQLServer.ToPostgreSQL.ConversionSettings"></a>

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

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

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

  例如，若要將已轉換程式碼中的註解數量降到最低，請選擇**僅限錯誤**。若要在已轉換的程式碼中包含所有動作項目的註解，請選擇**所有訊息**。
+ 允許 在 SQL Server 的不同資料表中使用具有相同名稱的索引。

  在 PostgreSQL 中，您在結構描述中使用的所有索引名稱都必須是唯一的。若要確保 AWS SCT 產生所有索引的唯一名稱，請選取**產生索引的唯一名稱**。
+ 將 SQL Server 程序轉換為 PostgreSQL 函數。

  PostgreSQL 第 10 版及更早版本不支援程序。對於不熟悉在 PostgreSQL 中使用程序的客戶， AWS SCT 可以將程序轉換為 函數。若要這樣做，請選取**將程序轉換為函數**。
+ 在資料表`EXEC`中模擬 的輸出。

  來源 SQL Server 資料庫可以將 的輸出存放在資料表`EXEC`中。 AWS SCT 會建立暫存資料表和模擬此功能的額外程序。若要使用此模擬，請選取**建立其他常式以處理開啟的資料集**。
+ 定義要用於轉換程式碼中結構描述名稱的範本。針對**結構描述名稱產生範本**，選擇下列其中一個選項：
  + **<source\_db>** – 使用 SQL Server 資料庫名稱做為 PostgreSQL 中的結構描述名稱。
  + **<source\_schema>** – 使用 SQL Server 結構描述名稱做為 PostgreSQL 中的結構描述名稱。
  + **<source\_db>\_<schema>** – 在 PostgreSQL 中使用 SQL Server 資料庫和結構描述名稱的組合做為結構描述名稱。
+ 保留來源物件名稱的字母大小寫。

  若要避免將物件名稱轉換為小寫，請選取**避免轉換為小寫以進行區分大小寫的操作**。此選項僅適用於您在目標資料庫中開啟區分大小寫選項時。
+ 保留來源資料庫中的參數名稱。

  若要將雙引號新增至轉換程式碼中的參數名稱，請選取**保留原始參數名稱**。

## 將 SQL Server 分割區轉換為 PostgreSQL 第 10 版分割區
<a name="CHAP_Source.SQLServer.ToPostgreSQL.PG10Partitions"></a>

當您將 Microsoft SQL Server 資料庫轉換為 Amazon Aurora PostgreSQL 相容版本 (Aurora PostgreSQL) 或 Amazon Relational Database Service for PostgreSQL (Amazon RDS for PostgreSQL) 時，請注意下列事項。

在 SQL Server 中，您可以使用分割功能建立分割區。從 SQL Server 分割資料表轉換到 PostgreSQL 版本 10 分割資料表時，請注意幾個潛在問題：
+ SQL Server 可讓您使用沒有 NOT NULL 限制的欄來分割資料表。在這種情況下，所有 NULL 值會移至最左邊分割區。PostgreSQL 不支援 RANGE 分割的 NULL 值。
+ SQL Server 允許您建立分割資料表的主要和唯一索引鍵。對於 PostgreSQL，您可以為每個分割區直接建立主要或唯一索引鍵。因此，遷移到 PostgreSQL 時，必須從父資料表移除 PRIMARY 或 UNIQUE KEY 限制。產生的金鑰名稱採用 格式`<original_key_name>_<partition_number>`。
+ SQL Server 允許您從分割資料表建立外部索引鍵限制以及對分割資料表建立外部索引鍵限制。PostgreSQL 不支援參考分割資料表的外部索引鍵。此外，PostgreSQL 也不支援從一個分割資料表參考另一個資料表的外部索引鍵。
+ SQL Server 允許您為分割資料表建立索引。對於 PostgreSQL，應為每個分割區直接建立索引。因此，遷移到 PostgreSQL 時，必須從父資料表移除索引。產生的索引名稱採用格式 `<original_index_name>_<partition_number>`。
+  PostgreSQL 不支援分割索引。

## 遷移考量事項
<a name="CHAP_Source.SQLServer.ToPostgreSQL.MigrationConsiderations"></a>

將 SQL Server 結構描述遷移至 PostgreSQL 時需要考慮的一些事項：
+ 在 PostgreSQL 中，結構描述中所有物件的名稱都必須是唯一的，包含索引。索引名稱在基礎資料表的結構描述中也必須是唯一的。在 SQL Server 中，不同資料表的索引名稱可以相同。

  為了確保索引名稱的唯一性，如果您的索引名稱不是唯一的， AWS SCT 可讓您選擇產生唯一的索引名稱。做法是在專案屬性中選擇選項 **Generate unique index names (產生唯一的索引名稱)**。此選項預設為啟用。如果啟用此選項，會使用格式 IX\_table\_name\_index\_name 建立唯一的索引名稱。如果停用此選項，索引名稱不變。
+ GOTO 陳述式和標籤可用來變更陳述式的執行順序。GOTO 陳述式後面的任何 Transact-SQL 陳述式都會被略過，並繼續處理標籤。GOTO 陳述式與標籤可以用在程序、批次或陳述式區塊中的任何地方。GOTO 陳述式也可以設為巢狀。

  PostgreSQL 不使用 GOTO 陳述式。當 AWS SCT 轉換包含 GOTO 陳述式的程式碼時，它會將陳述式轉換為使用 BEGIN...END 或 LOOP...END LOOP 陳述式。您可以在下表中找到如何 AWS SCT 轉換 GOTO 陳述式的範例。  
**SQL Server GOTO 陳述式與轉換後的 PostgreSQL 陳述式**    
[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/SchemaConversionTool/latest/userguide/CHAP_Source.SQLServer.ToPostgreSQL.html)
+ PostgreSQL 不支援 MERGE 陳述式。 會以下列方式 AWS SCT 模擬 MERGE 陳述式的行為：
  + 透過 INSERT ON CONFLICT 建構。
  + 透過使用 UPDATE FROM DML 陳述式，例如不含 WHEN NOT MATCHED 子句的 MERGE。
  + 透過使用 CURSOR (例如含有 DELETE 子句的 MERGE) 或使用複雜的 MERGE ON 條件陳述式。
+ AWS SCT 當 Amazon RDS 為目標時， 可以將資料庫觸發新增至物件樹狀結構。
+ AWS SCT 當 Amazon RDS 為目標時， 可以將伺服器層級觸發新增至物件樹狀結構。
+ SQL Server 會自動建立和管理 `deleted`和 `inserted`資料表。您可以使用這些臨時的記憶體駐留資料表來測試特定資料修改的效果，以及設定 DML 觸發動作的條件。 AWS SCT 可以在 DML 觸發陳述式內轉換這些資料表的使用情況。
+ AWS SCT 當 Amazon RDS 為目標時， 可以將連結的伺服器新增至物件樹狀結構。
+ 當從 Microsoft SQL Server 遷移到 PostgreSQL 時，內建的 SUSER\_SNAME 函數將進行轉換，如下所示：
  + SUSER\_SNAME – 傳回與安全性識別碼 (SID) 相關聯的登入名稱。
  + SUSER\_SNAME(<server\_user\_sid>) – 不支援。
  + SUSER\_SNAME() CURRENT\_USER – 傳回目前執行內容的使用者名稱。
  + SUSER\_SNAME(NULL) – 傳回 NULL。
+ 支援轉換表格值函數。表格值函數會傳回表格，並可在查詢中代替表格。
+ PATINDEX 將傳回指定表達式中模式第一次出現的開始位置，或所有有效的文字和字元資料類型。如果沒有找到該模式，它返回零。從 SQL Server 轉換為 Amazon RDS for PostgreSQL 時， AWS SCT 會取代使用 PATINDEX 搭配 aws\_sqlserver\_ext.patindex (<pattern character>， <expression character varying>) 的應用程式程式碼。
+ 在 SQL Server 中，使用者定義資料表類型是一種代表資料表結構定義的類型。您可以使用使用者定義的資料表類型來宣告預存程序或函數的資料表值參數。您也可以使用使用者定義的資料表類型，宣告您想要在批次或預存程序或函數內文中使用的資料表變數。透過建立暫存資料表，在 PostgreSQL 中 AWS SCT 模擬此類型。

從 SQL Server 轉換為 PostgreSQL 時， 會將 SQL Server 系統物件 AWS SCT 轉換為 PostgreSQL 中可識別的物件。下表顯示系統物件轉換方式。

 


| MS SQL Server 使用案例 | PostgreSQL 替換 | 
| --- | --- | 
| SYS.SCHEMAS | AWS\_SQLSERVER\_EXT.SYS\_SCHEMAS | 
| SYS.TABLES | AWS\_SQLSERVER\_EXT.SYS\_TABLES | 
| SYS.VIEWS | AWS\_SQLSERVER\_EXT.SYS\_VIEWS | 
| SYS.ALL\_VIEWS | AWS\_SQLSERVER\_EXT.SYS\_ALL\_VIEWS | 
| SYS.TYPES | AWS\_SQLSERVER\_EXT.SYS\_TYPES | 
| SYS.COLUMNS | AWS\_SQLSERVER\_EXT.SYS\_COLUMNS | 
| SYS.ALL\_COLUMNS | AWS\_SQLSERVER\_EXT.SYS\_ALL\_COLUMNS | 
| SYS.FOREIGN\_KEYS | AWS\_SQLSERVER\_EXT.SYS\_FOREIGN\_KEYS | 
| SYS.SYSFOREIGNKEYS | AWS\_SQLSERVER\_EXT.SYS\_SYSFOREIGNKEYS | 
| SYS.FOREIGN\_KEY\_COLUMNS | AWS\_SQLSERVER\_EXT.SYS\_FOREIGN\_KEY\_COLUMNS | 
| SYS.KEY\_CONSTRAINTS | AWS\_SQLSERVER\_EXT.SYS\_KEY\_CONSTRAINTS | 
| SYS.IDENTITY\_COLUMNS | AWS\_SQLSERVER\_EXT.SYS\_IDENTITY\_COLUMNS | 
| SYS.PROCEDURES | AWS\_SQLSERVER\_EXT.SYS\_PROCEDURES | 
| SYS.INDEXES | AWS\_SQLSERVER\_EXT.SYS\_INDEXES | 
| SYS.SYSINDEXES | AWS\_SQLSERVER\_EXT.SYS\_SYSINDEXES | 
| SYS.OBJECTS | AWS\_SQLSERVER\_EXT.SYS\_OBJECTS | 
| SYS.ALL\_OBJECTS | AWS\_SQLSERVER\_EXT.SYS\_ALL\_OBJECTS | 
| SYS.SYSOBJECTS | AWS\_SQLSERVER\_EXT.SYS\_SYSOBJECTS | 
| SYS.SQL\_MODULES | AWS\_SQLSERVER\_EXT.SYS\_SQL\_MODULES | 
| SYS.DATABASES | AWS\_SQLSERVER\_EXT.SYS\_DATABASES | 
| INFORMATION\_SCHEMA.SCHEMATA  | AWS\_SQLSERVER\_EXT.INFORMATION\_SCHEMA\_SCHEMATA | 
| INFORMATION\_SCHEMA.VIEWS | AWS\_SQLSERVER\_EXT.INFORMATION\_SCHEMA\_VIEWS | 
| INFORMATION\_SCHEMA.TABLES | AWS\_SQLSERVER\_EXT.INFORMATION\_SCHEMA\_TABLES | 
| INFORMATION\_SCHEMA.COLUMNS | AWS\_SQLSERVER\_EXT.INFORMATION\_SCHEMA\_COLUMNS | 
| INFORMATION\_SCHEMA.CHECK\_CONSTRAINTS | AWS\_SQLSERVER\_EXT.INFORMATION\_SCHEMA\_CHECK\_CONSTRAINTS | 
| INFORMATION\_SCHEMA.REFERENTIAL\_CONSTRAINTS | AWS\_SQLSERVER\_EXT.INFORMATION\_SCHEMA\_REFERENTIAL\_CONSTRAINTS | 
| INFORMATION\_SCHEMA.TABLE\_CONSTRAINTS | AWS\_SQLSERVER\_EXT.INFORMATION\_SCHEMA\_TABLE\_CONSTRAINTS | 
| INFORMATION\_SCHEMA.KEY\_COLUMN\_USAGE | AWS\_SQLSERVER\_EXT.INFORMATION\_SCHEMA\_KEY\_COLUMN\_USAGE | 
| INFORMATION\_SCHEMA.CONSTRAINT\_TABLE\_USAGE | AWS\_SQLSERVER\_EXT.INFORMATION\_SCHEMA\_CONSTRAINT\_TABLE\_USAGE  | 
| INFORMATION\_SCHEMA.CONSTRAINT\_COLUMN\_USAGE | AWS\_SQLSERVER\_EXT.INFORMATION\_SCHEMA\_CONSTRAINT\_COLUMN\_USAGE  | 
| INFORMATION\_SCHEMA.ROUTINES | AWS\_SQLSERVER\_EXT.INFORMATION\_SCHEMA\_ROUTINES | 
| SYS.SYSPROCESSES | AWS\_SQLSERVER\_EXT.SYS\_SYSPROCESSES | 
| sys.system\_objects | AWS\_SQLSERVER\_EXT.SYS\_SYSTEM\_OBJECTS | 