

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 将 SQL Server 转换为 MySQL
<a name="CHAP_Source.SQLServer.ToMySQL"></a>

要在转换后的 MySQL 代码中模拟 Microsoft SQL Server 数据库函数，请使用 AWS SCT中的 SQL Server 到 MySQL 扩展包。有关扩展包的更多信息，请参阅[将扩展包与 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
+ REFERENCES ON \$1.\$1
+ SELECT ON \$1.\$1
+ CREATE VIEW ON \$1.\$1
+ SHOW VIEW ON \$1.\$1
+ TRIGGER ON \$1.\$1
+ CREATE ROUTINE ON \$1.\$1
+ ALTER ROUTINE ON \$1.\$1
+ EXECUTE ON \$1.\$1
+ 插入，在 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 或更低版本作为目标，请运行以下命令。8.0 及更高版本的 MySQL 数据库不建议使用此命令。

```
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 可以在转换过程中使用子`MERGE`句和语句来模拟该`UPDATE FROM and DELETE FROM`语`INSERT ON DUPLICATE KEY`句。

  对于使用 `INSERT ON DUPLICATE KEY` 的正确模拟，请确保目标 MySQL 数据库上存在唯一约束或主键。
+ 可以使用一个 `GOTO` 语句和一个标签更改语句的运行顺序。将跳过接在 `GOTO` 语句后的任何 Transact-SQL 语句并且处理将在标签处继续。可在过程、批处理或语句块中的任意位置使用 `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_cn/SchemaConversionTool/latest/userguide/CHAP_Source.SQLServer.ToMySQL.html)
+ MySQL 不支持多语句表值函数。 AWS SCT 通过创建临时表并重写语句以使用这些临时表，在转换过程中模拟表值函数。