

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

# 將 SQL Server 轉換到 MySQL
<a name="CHAP_Source.SQLServer.ToMySQL"></a>

若要在轉換後的 MySQL 程式碼中模擬 Microsoft SQL Server 資料庫函數，請使用 SQL Server 到 MySQL 延伸套件 AWS SCT。如需詳細了解延伸套件，請參閱：[搭配 使用延伸套件 AWS Schema Conversion Tool](CHAP_ExtensionPack.md)。

**Topics**
+ [MySQL 做為目標資料庫的權限](#CHAP_Source.SQLServer.ToMySQL.ConfigureTarget)
+ [SQL Server 到 MySQL 的轉換設定](#CHAP_Source.SQLServer.ToMySQL.ConversionSettings)
+ [遷移考量事項](#CHAP_Source.SQLServer.ToMySQL.MigrationConsiderations)

## MySQL 做為目標資料庫的權限
<a name="CHAP_Source.SQLServer.ToMySQL.ConfigureTarget"></a>

做為目標的 MySQL 所需的權限如下：
+ CREATE ON \$1.\$1
+ ALTER ON \$1.\$1
+ DROP ON \$1.\$1
+ INDEX ON \$1.\$1
+ ON \$1.\$1 參考資料
+ SELECT ON \$1.\$1
+ 在 \$1.\$1 上建立檢視
+ SHOW VIEW ON \$1.\$1
+ 觸發開啟 \$1.\$1
+ 建立路由開啟 \$1.\$1
+ ALTER ROUTINE ON \$1.\$1
+ EXECUTE ON \$1.\$1
+ INSERT，更新 AWS\$1SQLSERVER\$1EXT.\$1
+ 在 AWS\$1SQLSERVER\$1EXT\$1DATA 上插入、更新、刪除。\$1
+ 在 AWS\$1SQLSERVER\$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 INSERT, UPDATE ON AWS_SQLSERVER_EXT.* TO 'user_name';
GRANT INSERT, UPDATE, DELETE ON AWS_SQLSERVER_EXT_DATA.* TO 'user_name';
GRANT CREATE TEMPORARY TABLES ON AWS_SQLSERVER_EXT_DATA.* TO 'user_name';
```

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

如果您使用 MySQL 資料庫 5.7 版或更低版本做為目標，請執行下列命令。對於 MySQL 資料庫 8.0 版和更新版本，此命令已棄用。

```
GRANT SELECT ON mysql.proc TO 'user_name';
```

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

## SQL Server 到 MySQL 的轉換設定
<a name="CHAP_Source.SQLServer.ToMySQL.ConversionSettings"></a>

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

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

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

  例如，若要將已轉換程式碼中的註解數量降到最低，請選擇**僅限錯誤**。若要在已轉換的程式碼中包含所有動作項目的註解，請選擇**所有訊息**。
+ 若要允許來源 SQL Server 資料庫將 的輸出存放在資料表`EXEC`中。 會 AWS SCT 建立暫存資料表和模擬此功能的額外程序。若要使用此模擬，請選取**建立其他常式以處理開啟的資料集**。

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

將 SQL Server 結構描述遷移至 MySQL 時，請考慮下列事項：
+ MySQL 不支援 `MERGE`陳述式。不過， AWS SCT 可以使用 `INSERT ON DUPLICATE KEY`子句和 `MERGE`陳述式，在轉換期間模擬`UPDATE FROM and DELETE FROM`陳述式。

  若要使用 正確模擬`INSERT ON DUPLICATE KEY`，請確定目標 MySQL 資料庫上存在唯一的限制條件或主索引鍵。
+ 您可以使用`GOTO`陳述式和標籤來變更陳述式執行的順序。任何遵循陳述式的 Transact-SQL `GOTO`陳述式都會略過，處理會在 標籤繼續。您可以在程序、批次或`GOTO`陳述式區塊內的任何位置使用陳述式和標籤。您也可以巢狀`GOTO`化陳述式。

  MySQL 不使用 `GOTO` 陳述式。當 AWS SCT 轉換包含`GOTO`陳述式的程式碼時，它會將陳述式轉換為使用 `BEGIN…END`或 `LOOP…END LOOP`陳述式。您可以在下表中找到如何 AWS SCT 轉換`GOTO`陳述式的範例。  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/SchemaConversionTool/latest/userguide/CHAP_Source.SQLServer.ToMySQL.html)
+ MySQL 不支援多陳述式資料表值函數。 透過建立暫存資料表和重寫陳述式來使用這些暫存資料表，在轉換期間 AWS SCT 模擬資料表值函數。