SQL Server 到 Azure SQL 托管实例迁移的评估规则
适用于: Azure SQL 托管实例
迁移工具通过运行多个评估规则来验证源 SQL Server 实例。 这些规则用于识别在将 SQL Server 数据库迁移到 Azure SQL 托管实例前必须要解决的问题。
本文列举了用于评估将 SQL Server 数据库迁移到 Azure SQL 托管实例的可行性的规则。
规则摘要
AnalysisCommand 作业
标题:AnalysisCommand 作业步骤在 Azure SQL 托管实例中不受支持。
类别:警告
描述
这是用于运行 Analysis Services 命令的作业步骤。 AnalysisCommand 作业步骤在 Azure SQL 托管实例中不受支持。
建议
检查 Azure Migrate 中的“受影响的对象”部分,查看所有使用 Analysis Services 命令作业步骤的作业,并评估是否可以删除作业步骤或受影响的对象。 或者,迁移到 Azure VM 上的 SQL Server。
详细信息:Azure SQL 托管实例中的 SQL Server 代理差异
AnalysisQuery 作业
标题:AnalysisQuery 作业步骤在 Azure SQL 托管实例中不受支持。
类别:警告
描述
这是用于运行 Analysis Services 查询的作业步骤。 AnalysisQuery 作业步骤在 Azure SQL 托管实例中不受支持。
建议
检查 Azure Migrate 中的“受影响的对象”部分,查看所有使用 Analysis Services 查询作业步骤的作业,并评估是否可以删除作业步骤或受影响的对象。 或者,迁移到 Azure VM 上的 SQL Server。
详细信息:Azure SQL 托管实例中的 SQL Server 代理差异
文件中的程序集
标题:带有文件参数的“CREATE ASSEMBLY”和“ALTER ASSEMBLY”在 Azure SQL 托管实例中不受支持。
类别:问题
描述
Azure SQL 托管实例不支持带有文件参数的 CREATE ASSEMBLY
或 ALTER ASSEMBLY
。 支持二进制参数。 有关在其中使用文件参数的特定对象,请参阅“受影响的对象”部分。
建议
使用带有文件参数的 CREATE ASSEMBLY
或 ALTER ASSEMBLY
查看对象。 如果任何此类对象是必需的,请将文件参数转换为二进制参数。 或者,迁移到 Azure VM 上的 SQL Server。
BULK INSERT
标题:使用非 Azure Blob 数据源的 BULK INSERT 在 Azure SQL 托管实例中不受支持。
类别:问题
描述
Azure SQL 托管实例无法访问文件共享或 Windows 文件夹。 请查看“受影响的对象”部分,了解 BULK INSERT 语句的特定用法,这些语句不引用 Azure Blob。 如果源不是 Azure Blob 存储,则在迁移到 Azure SQL 托管实例后,使用“BULK INSERT”的对象将无法工作。
建议
迁移到 Azure SQL 托管实例时,需要将 BULK INSERT 语句从使用本地文件或文件共享转换为使用 Azure Blob 存储中的文件。
详细信息:Azure SQL 托管实例中的批量插入和 OPENROWSET 差异
CLR 安全性
标题:标记为 SAFE 或 EXTERNAL_ACCESS 的 CLR 程序集被认为 UNSAFE
类别:警告
描述
Azure SQL 托管实例中强制实施 CLR 严格安全性模式。 此模式默认启用,并为包含用户定义的标记为 SAFE 或 EXTERNAL_ACCESS 的 CLR 程序集的数据库引入了中断性变更。
建议
CLR 在 .NET Framework 中使用代码访问安全性 (CAS)(不可再作为安全边界)。 使用 PERMISSION_SET = SAFE
创建的 CLR 程序集可以访问外部系统资源、调用非托管代码以及获取 sysadmin 特权。 在 SQL Server 2017 (14.x) 及更高版本中,sp_configure
选项 clr strict security 增强了 CLR 程序集的安全性。 默认启用 clr strict security
,并将 SAFE
和 EXTERNAL_ACCESS
程序集与标记为 UNSAFE
的程序集同等对待。 可禁用 clr strict security
选项以实现后向兼容性,但不建议这样做。
建议使用证书或非对称密钥签署所有程序集,且该证书或非对称密钥具有已在 UNSAFE ASSEMBLY
数据库中获得 master
权限的相应登录名。 SQL Server 管理员还可以将程序集添加到数据库引擎应信任的程序集列表。 有关详细信息,请参阅 sys.sp_add_trusted_assembly。
COMPUTE 子句
标题:不再支持 COMPUTE 子句,已将其删除。
类别:警告
描述
COMPUTE 子句生成的总计在结果集的末尾显示为附加的汇总列。 但是,此子句在 Azure SQL 托管实例中不再受支持。
建议
需要改用 ROLLUP 运算符来重新编写 T-SQL 模块。 下面的代码演示如何将 COMPUTE 替换为 ROLLUP:
USE AdventureWorks2022;
GO
SELECT SalesOrderID,
UnitPrice,
UnitPriceDiscount
FROM Sales.SalesOrderDetail
ORDER BY SalesOrderID COMPUTE SUM(UnitPrice),
SUM(UnitPriceDiscount) BY SalesOrderID;
GO
SELECT SalesOrderID,
UnitPrice,
UnitPriceDiscount,
SUM(UnitPrice) AS UnitPrice,
SUM(UnitPriceDiscount) AS UnitPriceDiscount
FROM Sales.SalesOrderDetail
GROUP BY SalesOrderID,
UnitPrice,
UnitPriceDiscount
WITH ROLLUP;
Cryptographic provider
标题:已发现使用了 CREATE CRYPTOGRAPHIC PROVIDER 或 ALTER CRYPTOGRAPHIC PROVIDER,但这两个语句在 Azure SQL 托管实例中不受支持。
类别:问题
描述
Azure SQL 托管实例不支持 CRYPTOGRAPHIC PROVIDER 语句,因为它无法访问文件。 请查看“受影响的对象”部分,了解 CRYPTOGRAPHIC PROVIDER 语句的特定用法。 迁移到 Azure SQL 托管实例后,使用“CREATE CRYPTOGRAPHIC PROVIDER”或“ALTER CRYPTOGRAPHIC PROVIDER”的对象将无法工作。
建议
检查使用“CREATE CRYPTOGRAPHIC PROVIDER”或“ALTER CRYPTOGRAPHIC PROVIDER”的对象。 在必须使用的任何此类对象中,删除所使用的这些功能。 或者,迁移到 Azure VM 上的 SQL Server。
数据库兼容性
标题:不支持低于 100 的数据库兼容性级别
类别:警告
描述
数据库兼容性级别是一个非常有用的工具,借助该工具,可以在升级 SQL Server 数据库引擎的同时,通过保持与升级前相同的数据库兼容性级别来使连接应用程序保持正常运行状态,从而帮助实现数据库现代化。 Azure SQL 托管实例不支持低于 100 的兼容性级别。 如果在 Azure SQL 托管实例上还原兼容性级别低于 100 的数据库,则兼容性级别将升级到 100。
建议
在 Azure SQL 托管实例上将数据库兼容性级别升级到 100 后,评估应用程序功能是否完好无损。 或者,迁移到 Azure VM 上的 SQL Server。
DATABASE_PRINCIPAL_ALIASES
标题:不再支持并已删除 SYS.DATABASE_PRINCIPAL_ALIASES。
类别:问题
描述
在 Azure SQL 托管实例中,不再支持并已删除 sys.database_principal_aliases
。
建议
请使用角色而不是别名。
DISABLE_DEF_CNST_CHK 选项
标题:不再支持并已删除 SET 选项 DISABLE_DEF_CNST_CHK。
类别:问题
描述
在 Azure SQL 托管实例中,不再支持并已删除 SET 选项 DISABLE_DEF_CNST_CHK。
FASTFIRSTROW 提示
标题:不再支持并已删除 FASTFIRSTROW 查询提示。
类别:警告
描述
在 Azure SQL 托管实例中,不再支持并已删除 FASTFIRSTROW 查询提示。
建议
FASTFIRSTROW 查询提示改用 OPTION (FAST n)。
FILESTREAM
标题:文件流和 Filetable 在 Azure SQL 托管实例中不受支持。
类别:问题
描述
文件流功能使用户可以在 NTFS 文件系统中存储文档文档、图像和视频等非结构化数据,但此功能在 Azure SQL 托管实例中不受支持。 无法迁移此数据库,因为无法在 Azure SQL 托管实例上还原包含文件流文件组的备份。
建议
将非结构化文件上传到 Azure Blob 存储,并在 Azure SQL 托管实例中存储与这些文件相关的元数据(名称、类型、URL 位置、存储密钥等)。 可能需要对应用程序进行重新设计,以启用与 Azure SQL 托管实例的 Blob 流式传输。 或者,迁移到 Azure VM 上的 SQL Server。
详细信息:与 SQL Azure 的 Blob 流式传输博客
异类 MS DTC
标题:Azure SQL 托管实例不支持对非 SQL Server 远程服务器使用 BEGIN DISTRIBUTED TRANSACTION。
类别:问题
描述
如果远程服务器不是 SQL Server,则由 Transact SQL BEGIN DISTRIBUTED TRANSACTION 启动并由 Microsoft 分布式事务处理协调器 (MS DTC) 管理的分布式事务 Azure SQL 托管实例中不受支持。
建议
检查 Azure Migrate 中的“受影响的对象”部分,查看使用 BEGIN DISTRUBUTED TRANSACTION 的所有对象。 考虑将参与者数据库迁移到 Azure SQL 托管实例,其中支持跨多个实例的分布式事务。 有关详细信息,请参阅 Azure SQL 托管实例的跨多个服务器的事务。
或者,迁移到 Azure VM 上的 SQL Server。
同源 MS DTC
标题:Azure SQL 托管实例支持跨多个服务器的 BEGIN DISTRIBUTED TRANSACTION。
类别:问题
描述
Azure SQL 托管实例支持由 Transact SQL BEGIN DISTRIBUTED TRANSACTION 启动并由 Microsoft 分布式事务处理协调器 (MS DTC) 管理的跨多个服务器的分布式事务。
建议
检查 Azure Migrate 中的“受影响的对象”部分,查看使用 BEGIN DISTRUBUTED TRANSACTION 的所有对象。 考虑将参与者数据库迁移到 Azure SQL 托管实例,其中支持跨多个实例的分布式事务。 有关详细信息,请参阅 Azure SQL 托管实例的跨多个服务器的事务。
或者,迁移到 Azure VM 上的 SQL Server。
链接服务器(非 SQL 提供程序)
标题:Azure SQL 托管实例不支持将链接服务器用于非 SQL 提供程序。
类别:问题
描述
链接服务器使 SQL Server 数据库引擎可以对 SQL Server 实例外部的 OLE DB 数据源执行命令。 Azure SQL 托管实例不支持将链接服务器用于非 SQL 提供程序。
建议
如果远程服务器提供程序不是 SQL Server,而是 Oracle 或 Sybase 等,则 Azure SQL 托管实例不支持链接服务器功能。
建议执行以下操作以避免需要使用链接服务器:
- 确定哪些从属数据库属于非 SQL 远程服务器,并考虑将它们移到要迁移的数据库中。
- 将从属数据库迁移到受支持的目标,例如 SQL 托管实例、SQL 数据库、Azure Synapse 和 SQL Server 实例。
- 考虑在 Azure SQL 托管实例和 Azure 虚拟机上的 SQL Server (SQL VM) 之间创建链接服务器。 然后在 SQL VM 和 Oracle 或 Sybase 等服务器之间创建链接服务器。此方法确实涉及两个跃点,但可用作临时解决方法。
- 或者,迁移到 Azure VM 上的 SQL Server。
合并作业
标题:合并作业步骤在 Azure SQL 托管实例中不受支持。
类别:警告
描述
这是用于激活复制合并代理的作业步骤。 复制合并代理是一个将数据库表中保存的初始快照应用于订阅服务器的实用工具可执行文件。 它还合并自初始快照创建后发布服务器上发生的增量数据更改,并根据配置的规则或通过使用创建的自定义冲突解决程序来协调冲突。 合并作业步骤在 Azure SQL 托管实例中不受支持。
建议
检查 Azure Migrate 中的“受影响的对象”部分,查看所有使用合并作业步骤的作业,并评估是否可以删除作业步骤或受影响的对象。 或者,迁移到 Azure VM 上的 SQL Server。
详细信息:Azure SQL 托管实例中的 SQL Server 代理差异
SQL 托管实例数据库大小
标题:Azure SQL 托管实例不支持超过 16 TB 的数据库大小。
类别:问题
描述
数据库大小超过实例的最大保留存储空间。 不能选择此数据库进行迁移,因为大小超出了允许的限制。
建议
评估数据是否可以存档、压缩或分片到多个数据库中。 或者,迁移到 Azure VM 上的 SQL Server。
详细信息:Azure SQL 托管实例的硬件特性
SQL 托管实例实例大小
标题:Azure SQL 托管实例中的实例最大存储大小不能超过 8 TB。
类别:警告
描述
所有数据库的总大小超过实例的最大保留存储空间。
建议
如果所有数据库都必须在同一个实例上,则请考虑将数据库迁移到其他 Azure SQL 托管实例或 Azure 虚拟机上的 SQL Server。
详细信息:Azure SQL 托管实例的硬件特性
多个日志文件
标题:Azure SQL 托管实例不支持多个日志文件。
类别:问题
描述
SQL Server 允许数据库记录到多个文件。 此数据库具有多个日志文件,但 Azure SQL 托管实例不支持多个日志文件。 无法迁移此数据库,因为无法在 Azure SQL 托管实例上还原备份。
建议
Azure SQL 托管实例仅支持每个数据库一个日志。 将此数据库迁移到 Azure 之前,需要保留一个日志文件而删除其余所有日志文件:
ALTER DATABASE [database_name] REMOVE FILE [log_file_name]
Next 列
标题:名为 NEXT 的表和列将导致 Azure SQL 托管实例发生错误。
类别:问题
描述
检测到名为 NEXT 的表或列。 Microsoft SQL Server 中引入的序列使用 ANSI 标准 NEXT VALUE FOR 功能。 如果表或列的名称为 NEXT,列的别名为带有省略 AS 的 ANSI 标准的 VALUE,则可能导致错误。
建议
在设置表或列的别名时重写语句以包含 ANSI 标准 AS 关键字。 例如,当列名为 NEXT 且该列的别名为 VALUE 时,查询 SELECT NEXT VALUE FROM TABLE 会导致发生错误,并且应重新编写为 SELECT NEXT AS VALUE FROM TABLE。 例如,如果表的名称为 NEXT 且其别名为 VALUE,查询 SELECT Col1 FROM NEXT VALUE 会导致发生错误,并且应重新编写为 SELECT Col1 FROM NEXT AS VALUE。
非 ANSI 样式左外部联接
标题:不再支持并已删除非 ANSI 样式左外部联接。
类别:警告
描述
在 Azure SQL 托管实例中,不再支持并已删除非 ANSI 样式左外部联接。
建议
使用 ANSI 联接语法。
非 ANSI 样式右外部联接
标题:不再支持并已删除非 ANSI 样式右外部联接。
类别:警告
描述
在 Azure SQL 托管实例中,不再支持并已删除非 ANSI 样式右外部联接。
建议
使用 ANSI 联接语法。
数据库数目超过 100 个
标题:每个 Azure SQL 托管实例最多支持 100 个数据库。
类别:警告
描述
除非已达到实例存储大小限制,否则 Azure SQL 托管实例支持的最大数据库数目为 100 个。
建议
如果所有数据库都必须在同一个实例上,则请考虑将数据库迁移到其他 Azure SQL 托管实例或 Azure 虚拟机上的 SQL Server。
详细信息:Azure SQL 托管实例资源限制
OPENROWSET(非 Blob 数据源)
标题:Azure SQL 托管实例不支持将批量操作中使用的 OpenRowSet 用于非 Azure Blob 存储数据源。
类别:问题
描述
OPENROWSET 通过内置的 BULK 提供程序支持批量操作,该提供程序使文件中的数据可被读取并作为行集返回。 Azure SQL 托管实例不支持将 OPENROWSET 用于非 Azure Blob 存储数据源。
建议
由于 Azure SQL 托管实例无法访问文件共享和 Windows 文件夹,因此必须从 Azure Blob 存储导入文件。 因此,OPENROWSET 函数中仅支持 DATASOURCE Blob 类型。 或者,迁移到 Azure VM 上的 SQL Server。
详细信息:Azure SQL 托管实例中的批量插入和 OPENROWSET 差异
OPENROWSET(非 SQL 提供程序)
标题:Azure SQL 托管实例不支持将 OpenRowSet 用于非 SQL 提供程序。
类别:问题
描述
当访问链接服务器中的表时,这种方法是一种替代方法,并且是一种使用 OLE DB 连接并访问远程数据的一次性的临时方法。 Azure SQL 托管实例不支持将 OpenRowSet 用于非 SQL 提供程序。
建议
OPENROWSET 函数只能用于对 SQL Server 实例(托管实例、本地实例或虚拟机中的实例)执行查询。 支持提供程序 SQLNCLI
、SQLNCLI11
、SQLOLEDB
和 MSOLEDBSQL
(建议)。 对于新开发,推荐使用 Microsoft OLE DB Driver for SQL Server。
建议的操作是确定哪些从属数据库属于非 SQL 远程服务器,并考虑将它们移到要迁移的实例中。
详细信息:Azure SQL 托管实例中的批量插入和 OPENROWSET 差异
PowerShell 作业
标题:PowerShell 作业步骤在 Azure SQL 托管实例中不受支持。
类别:警告
描述
这是运行 PowerShell 脚本的作业步骤。 PowerShell 作业步骤在 Azure SQL 托管实例中不受支持。
建议
检查 Azure Migrate 中的“受影响的对象”部分,查看所有使用 PowerShell 作业步骤的作业,并评估是否可以删除作业步骤或受影响的对象。 评估是否可以使用 Azure 自动化。 或者,迁移到 Azure VM 上的 SQL Server。
详细信息:Azure SQL 托管实例中的 SQL Server 代理差异
队列读取器作业
标题:队列读取器作业步骤在 Azure SQL 托管实例中不受支持。
类别:警告
描述
这是用于激活复制队列读取器代理的作业步骤。 复制队列读取器代理是一个可执行文件,用于读取存储在 Microsoft SQL Server 队列或 Microsoft 消息队列中的消息,然后将这些消息应用于发布服务器。 队列读取器代理与允许排队更新的快照发布和事务发布一起使用。 队列读取器作业步骤在 Azure SQL 托管实例中不受支持。
建议
检查 Azure Migrate 中的“受影响的对象”部分,查看所有使用队列读取器作业步骤的作业,并评估是否可以删除作业步骤或受影响的对象。 或者,迁移到 Azure VM 上的 SQL Server。
详细信息:Azure SQL 托管实例中的 SQL Server 代理差异
RAISERROR
标题:应将旧式的 RAISERROR 调用替换为等效的新式调用。
类别:警告
描述
类似于以下示例的 RAISERROR 调用称为旧式,因为它们不包含逗号和括号。 RAISERROR 50001 'this is a test'
。 在 Azure SQL 托管实例中,不再支持并已删除 RAISERROR 的这种调用方法。
建议
使用当前的 RAISERROR 语法重新编写语句,或评估 BEGIN TRY { } END TRY BEGIN CATCH { THROW; } END CATCH
的新式方法是否可行。
SQL Mail
标题:不再支持 SQL Mail。
类别:警告
描述
在 Azure SQL 托管实例中,不再支持并已删除 SQL Mail。
建议
使用数据库邮件。
SystemProcedures110
标题:检测到引用已删除的系统存储过程的语句,这些系统存储过程在 Azure SQL 托管实例中不可用。
类别:警告
描述
今后不能在 Azure SQL 托管实例中使用不受支持的系统存储过程和扩展存储过程 – sp_dboption
、sp_addserver
、sp_dropalias
、sp_activedirectory_obj
、sp_activedirectory_scp
和 sp_activedirectory_start
。
建议
删除对不受支持并且已从 Azure SQL Managed托管实例中删除的系统存储过程的引用。
Transact-SQL 作业
标题:TSQL 作业步骤包含 Azure SQL 托管实例不支持的命令
类别:警告
描述
这是在计划的时间运行 Transact-SQL 脚本的作业步骤。 TSQL 作业步骤包含 Azure SQL 托管实例不支持的命令。
建议
检查 Azure Migrate 中的“受影响的对象”部分,查看所有包含 Azure SQL 托管实例不支持的命令的作业,并评估是否可以删除作业步骤或受影响的对象。 或者,迁移到 Azure VM 上的 SQL Server。
详细信息:Azure SQL 托管实例中的 SQL Server 代理差异
跟踪标志
标题:找到 Azure SQL 托管实例不支持的跟踪标志
类别:警告
描述
Azure SQL 托管实例仅支持有限数量的全局跟踪标志, 不支持会话跟踪标志。
建议
检查 Azure Migrate 中的“受影响的对象”部分,查看 Azure SQL 托管实例不支持的所有跟踪标志,并评估是否可以删除这些跟踪标志。 或者,迁移到 Azure VM 上的 SQL Server。
详细信息:跟踪标志
Windows 身份验证
标题:通过 Windows 身份验证映射的数据库用户(集成安全性)在 Azure SQL 托管实例中不受支持
类别:警告
描述
Azure SQL 托管实例支持以下两种类型的身份验证:
- SQL 身份验证,使用用户名和密码
- Microsoft Entra 身份验证,其使用由 Microsoft Entra ID 托管的标识,并且受托管域和集成域支持。
通过 Windows 身份验证映射的数据库用户(集成安全性)在 Azure SQL 托管实例中不受支持。
建议
将本地 Active Directory 与 Microsoft Entra ID 联合。 然后,可以将 Windows 标识替换为等效的 Microsoft Entra 标识。 或者,迁移到 Azure VM 上的 SQL Server。
详细信息:SQL 托管实例安全功能
xp_cmdshell
标题:xp_cmdshell 在 Azure SQL 托管实例中不受支持。
类别:问题
描述
xp_cmdshell
会生成 Windows 命令 shell 并传入要执行的字符串,它在 Azure SQL 托管实例中不受支持。
建议
检查 Azure Migrate 中的“受影响的对象”部分,查看所有使用 xp_cmdshell
的对象,并评估是否可以删除对 xp_cmdshell
的引用或受影响的对象。 考虑了解 Azure 自动化,它提供基于云的自动化和配置服务。 或者,迁移到 Azure VM 上的 SQL Server。