Azure SQL托管实例无法创建包含数据库问题咨询
Azure SQL托管实例包含数据库配置问题排查与解决方案
核心问题复盘
- 混合模式认证(同时启用Azure AD+SQL Server认证)的托管实例中,即便执行启用包含数据库的命令并重启实例,仍无法正常使用PARTIAL包含数据库:
- SSMS新建数据库时「Containment type」选项灰化不可用
- 通过T-SQL创建
CONTAINMENT = PARTIAL数据库后,SSMS显示其Containment状态为None,且无法创建带密码的包含用户 - 纯SQL Server认证的托管实例可正常创建包含数据库及用户,但SSMS仍会显示Containment为None(属于界面显示bug,不影响功能)
问题根源
混合模式认证的托管实例存在包含数据库功能的兼容性限制:
- 当实例启用Azure AD认证时,包含数据库的核心功能会被静默限制,导致T-SQL创建命令执行成功后,数据库实际仍为非包含状态,无法创建带密码的包含用户
- 纯SQL Server认证实例无此限制,SSMS显示Containment为None属于界面同步延迟问题,可通过T-SQL验证实际状态:
若返回结果为SELECT name, containment_desc FROM sys.databases WHERE name = 'Test'PARTIAL,则说明数据库已正确配置为包含数据库,SSMS显示不影响功能使用
正确配置方案(按实例认证类型区分)
场景1:纯SQL Server认证托管实例(推荐用于依赖包含数据库的业务场景)
- 创建实例时选择仅SQL Server认证,不启用Azure AD认证
- 执行命令启用包含数据库认证:
EXEC sys.sp_configure N'contained database authentication', N'1' GO RECONFIGURE WITH OVERRIDE GO - 通过Azure门户重启托管实例
- 创建包含数据库:
CREATE DATABASE [Test] CONTAINMENT = PARTIAL; - 验证包含状态(以T-SQL查询结果为准,忽略SSMS显示):
SELECT containment_desc FROM sys.databases WHERE name = 'Test'; - 在包含数据库内创建带密码的用户:
USE [Test]; CREATE USER [TestUser] WITH PASSWORD = 'Test.12345';
场景2:混合模式认证托管实例(需同时使用Azure AD与包含数据库)
目前该场景下包含数据库的SQL Server密码用户功能存在限制,可采用以下替代方案:
- 使用Azure AD包含用户替代SQL Server密码用户:
USE [Test]; CREATE USER [AADUser@domain.com] FROM EXTERNAL PROVIDER; - 若必须使用SQL Server密码用户,需将实例切换为纯SQL Server认证(注意:切换会清除所有Azure AD相关配置,需提前备份)
关键注意事项
- 微软文档中「Azure SQL托管实例与本地SQL Server行为一致」的描述未明确混合模式认证下的功能限制,属于文档细节缺失
- 依赖包含数据库实现行级安全时,必须确保用户为数据库级包含用户,而非实例级登录映射的用户
内容的提问来源于stack exchange,提问作者Emperor Eto
相关产品推荐
相关产品推荐

