将 SQL Server 转换为 MySQL
要在转换后的 MySQL 代码中模拟 Microsoft SQL Server 数据库函数,请使用 AWS SCT 中的 SQL Server 到 MySQL 扩展包。有关扩展包的更多信息,请参阅通过 AWS Schema Conversion Tool 使用扩展包。
将 MySQL 用作目标数据库的权限
下面列出了将 MySQL 用作目标所需的权限:
CREATE ON *.*
ALTER ON *.*
DROP ON *.*
INDEX ON *.*
REFERENCES ON *.*
SELECT ON *.*
CREATE VIEW ON *.*
SHOW VIEW ON *.*
TRIGGER ON *.*
CREATE ROUTINE ON *.*
ALTER ROUTINE ON *.*
EXECUTE ON *.*
INSERT, UPDATE ON AWS_SQLSERVER_EXT.*
INSERT, UPDATE, DELETE ON AWS_SQLSERVER_EXT_DATA.*
CREATE TEMPORARY TABLES ON AWS_SQLSERVER_EXT_DATA.*
您可以使用以下代码示例创建数据库用户并授予权限。
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_name
替换为用户名。然后,将 your_password
替换为安全密码。
如果将 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 的转换设置
要编辑 SQL Server 到 MySQL 的转换设置,请在 AWS SCT 中选择设置,然后选择转换设置。从上方的列表中选择 SQL Server,然后选择 SQL Server – MySQL。AWS SCT 显示 SQL Server 到 MySQL 转换的所有可用设置。
AWS SCT 中的 SQL Server 到 MySQL 转换设置包括以下各项的选项:
-
限制转换后的代码中操作项的注释数量。
对于在转换后的代码中为所选严重性级别及更高级别的操作项添加注释,请选择操作项的严重性。AWS SCT 会在转换后的代码中为所选严重性级别及更高级别的操作项添加注释。
例如,要最大限度地减少转换后的代码中的注释数量,请选择仅错误。要在转换后的代码中包含所有操作项的注释,请选择所有消息。
-
允许源 SQL Server 数据库将
EXEC
的输出存储在表中。AWS SCT 创建临时表和模拟此功能的附加过程。要使用此模拟,请选择创建额外的例程处理开放数据集。
迁移注意事项
将 SQL Server 架构迁移到 MySQL 时的注意事项:
MySQL 不支持
MERGE
语句。但是,AWS SCT 可以在转换过程中使用INSERT ON DUPLICATE KEY
子句和UPDATE FROM and DELETE FROM
语句来模拟MERGE
语句。对于使用
INSERT ON DUPLICATE KEY
的正确模拟,请确保目标 MySQL 数据库上存在唯一约束或主键。可以使用一个
GOTO
语句和一个标签更改语句的运行顺序。将跳过接在GOTO
语句后的任何 Transact-SQL 语句并且处理将在标签处继续。可在过程、批处理或语句块中的任意位置使用GOTO
语句和标签。您也可以嵌套GOTO
语句。MySQL 不使用
GOTO
语句。当 AWS SCT 转换包含GOTO
语句的代码时,它将转换此语句以使用BEGIN…END
或LOOP…END LOOP
语句。在下表中可以找到有关 AWS SCT 如何转换GOTO
语句的示例。SQL Server 语句 MySQL 语句 BEGIN .... statement1; .... GOTO label1; statement2; .... label1: Statement3; .... END
BEGIN label1: BEGIN .... statement1; .... LEAVE label1; statement2; .... END; Statement3; .... END
BEGIN .... statement1; .... label1: statement2; .... GOTO label1; statement3; .... statement4; .... END
BEGIN .... statement1; .... label1: LOOP statement2; .... ITERATE label1; LEAVE label1; END LOOP; statement3; .... statement4; .... END
BEGIN .... statement1; .... label1: statement2; .... statement3; .... statement4; .... END
BEGIN .... statement1; .... label1: BEGIN statement2; .... statement3; .... statement4; .... END; END
MySQL 不支持多语句表值函数。AWS SCT 会在转换过程中通过创建临时表并重写使用这些临时表的语句,来模拟表值函数。