适用于:Azure SQL 数据库
Azure SQL 托管实例
Azure Synapse Analytics(仅限专用 SQL 池)
现在可以从Microsoft Entra ID(以前Azure Active Directory)创建和使用服务器主体,这些主体是Azure SQL 数据库和Azure SQL 托管实例虚拟master数据库中的登录名。
注意
Microsoft Entra 服务器主体(登录名)现已正式适用于 Azure SQL 数据库、Azure SQL 托管实例 和 SQL Server 2022 及更高版本。 Microsoft Entra 服务器主体目前在 Azure Synapse Analytics 中处于公共预览阶段。
将 Microsoft Entra 服务器主体与 Azure SQL 资源配合使用可以获得多项优势:
- 支持用于权限管理的 Azure SQL 数据库服务器角色。
- 支持具有 SQL 数据库特殊角色(例如
loginmanager和dbmanager角色)的多个 Microsoft Entra 用户。 - SQL 登录名与 Microsoft Entra 登录名之间的功能同等性。
- 增加功能改进支持,例如使用仅限 Microsoft Entra 身份验证。 “仅限 Microsoft Entra 身份验证”允许禁用 SQL 身份验证,这包括 SQL 服务器管理员、SQL 登录名和用户的身份验证。
- 允许 Microsoft Entra 主体支持异地副本。 Microsoft Entra 主体可以连接到用户数据库的异地副本,并对主服务器具有 只读 和 拒绝 权限。
- 使用具有特殊角色的 Microsoft Entra 服务主体登录名来全自动创建用户和数据库,以及执行 Microsoft Entra 应用程序的维护。
有关在 Azure SQL 中进行 Microsoft Entra 身份验证的详细信息,请参阅使用 Microsoft Entra 身份验证。
权限
在虚拟 master 数据库中利用或创建 Microsoft Entra 登录名需要以下权限。
- Microsoft Entra 管理员权限,或充当
loginmanager服务器角色的成员身份。 第一个 Microsoft Entra 登录名只能由 Microsoft Entra 管理员创建。 - 必须是用于 Azure SQL 数据库的同一目录中的 Microsoft Entra ID 成员。
默认情况下,在 master 数据库中新创建的 Microsoft Entra 登录名会被授予 VIEW ANY DATABASE 权限。
Microsoft Entra 主体语法
使用以下语法来创建和管理 Microsoft Entra 服务器和数据库主体。
创建登录名
此语法基于 Microsoft Entra 标识来创建服务器级登录名。 只有 Microsoft Entra 管理员才能在虚拟 master 数据库中执行此命令。
CREATE LOGIN login_name
{
FROM EXTERNAL PROVIDER [WITH OBJECT_ID = 'objectid']
| WITH <option_list> [,..]
}
<option_list> ::=
PASSWORD = { 'password' }
[ , SID = sid ]
login_name 指定 Microsoft Entra 主体,该主体是 Microsoft Entra 用户、组或应用程序。
有关详细信息,请参阅 CREATE LOGIN (Transact-SQL)。
根据登录信息创建用户
以下 T-SQL 语法创建与虚拟 master 数据库中的 Microsoft Entra 登录名对应的数据库级 Microsoft Entra 主体。 与创建数据库包含 Microsoft Entra 用户的语法类似,唯一的区别在于指定 FROM LOGIN [login_name],而非 FROM EXTERNAL PROVIDER。
要从 Microsoft Entra 登录名创建 Microsoft Entra 用户,可以使用以下语法。
CREATE USER [user_name] FROM LOGIN [login_name]
可以使用来自 sys.database_principals 的 SID 列来区分 Microsoft Entra 包含数据库用户与从登录名创建的 Microsoft Entra 用户。 对于包含的数据库用户,SID 是长度为 16 的二进制字符串。 对于基于登录名的用户,SID 长度为 18,后缀为 AADE。
注意
将 AADE 后缀追加到 SID 是我们将 Microsoft Entra 用户标识为从登录名所创建用户的方法。 但是,这也意味着登录名及其用户的 SID 在 sys.server_principals 和 sys.database_principals 之间不匹配。 若要将用户关联回其登录名,必须先删除 AADE 后缀。
若要了解基于登录名的用户与包含的数据库用户之间的概念差异,请参阅包含的数据库用户。
有关创建用户语法的更多信息,请参阅 CREATE USER (Transact-SQL)。
使用 ALTER LOGIN 禁用或启用登录名
ALTER LOGIN (Transact-SQL) DDL 语法可用于在 Azure SQL 数据库中启用或禁用 Microsoft Entra 登录名。
ALTER LOGIN [login_name] DISABLE
禁用登录名后,不再允许使用该服务器主体来建立连接。 它还会使基于该登录名创建的所有数据库主体(用户)无法连接到各自对应的数据库。
注意
ALTER LOGIN login_name DISABLE不会影响独立数据库用户,因为这些用户未与登录名关联。Microsoft Entra 组不支持
ALTER LOGIN login_name DISABLE。已禁用的单个登录名不能属于某个用户,而该用户属于在
master数据库中创建的登录名组(例如 Microsoft Entra 管理员组)。要使
DISABLE或ENABLE更改立即生效,必须使用 T-SQL 命令清除身份验证缓存和 TokenAndPermUserStore 缓存。DBCC FLUSHAUTHCACHE DBCC FREESYSTEMCACHE('TokenAndPermUserStore') WITH NO_INFOMSGS
Microsoft Entra 主体的角色
SQL 数据库的特殊角色(包括 dbmanager 和 loginmanager)可分配给用于 Microsoft Entra 主体的虚拟 master 数据库中的 用户。
Azure SQL 数据库服务器角色可分配给虚拟数据库中的登录名。
有关如何授予这些角色的教程,请参阅教程:创建和使用 Microsoft Entra 服务器登录名。
限制和备注
- SQL Server 管理员无法在任何数据库中创建 Microsoft Entra 登录名或用户。
- SQL 管理员或 SQL 用户不能执行下列 Microsoft Entra 操作:
CREATE LOGIN [bob@contoso.com] FROM EXTERNAL PROVIDERCREATE USER [bob@contoso.com] FROM EXTERNAL PROVIDEREXECUTE AS USER [bob@contoso.com]ALTER AUTHORIZATION ON securable::name TO [bob@contoso.com]
- Azure SQL 数据库和 Azure Synapse Analytics 不支持模拟 Microsoft Entra 服务器主体(登录名)的身份。 对于 SQL 托管实例:受支持
- EXECUTE AS 子句 (Transact-SQL)
- EXECUTE AS (Transact-SQL)
- 所有 Microsoft SQL 产品都支持在用户数据库中模拟 Microsoft Entra 数据库主体(用户)。
- Microsoft Entra 登录名不能与 Microsoft Entra 管理员重叠。 Microsoft Entra 管理员的优先级高于任何登录方式。 如果某个 Microsoft Entra 帐户已经有权以 Microsoft Entra 管理员身份单独访问服务器,或作为组成员访问服务器,则为此帐户创建的登录名不起任何作用。 但是,通过 T-SQL 创建登录名不会被阻止。 在帐户对服务器进行身份验证后,登录名将拥有 Microsoft Entra 管理员(而不是新建的登录名)的有效权限。
- 不支持更改特定 Microsoft Entra 登录名对象的权限:
GRANT <PERMISSION> ON LOGIN :: <Microsoft Entra account> TO <Any other login>
- 更改 Microsoft Entra 登录名的权限时,在默认情况下,更改仅在下次登录名连接到 Azure SQL 数据库时生效。 与登录名建立的任何现有开放连接都不会受到影响。 若要强制权限更改立即生效,可以手动清除身份验证和 TokenAndPermUserStore,如前面在使用 ALTER LOGIN 禁用或启用登录名时所述。 使用 ALTER SERVER ROLE 更改服务器角色成员身份时,此行为也适用。
- 在 SQL Server Management Studio 中,用于创建用户的脚本命令不会检查
master中是否已经存在具有相同名称的 Microsoft Entra 登录名。 它始终会为包含的数据库 Microsoft Entra 用户生成 T-SQL。 - 如果你尝试从具有非唯一显示名称的服务主体创建登录名或用户,则可能会出现错误。 有关缓解此错误的详细信息,请参阅具有非唯一显示名称的 Microsoft Entra 登录名和用户。
- 在 Azure SQL 数据库和 Azure Synapse Analytics 中,使用 Microsoft Entra 登录名创建的数据库用户在被授予角色和权限时可能会遇到延迟。 如果遇到这种情况,请使用以下命令解决此问题:
- 从用户数据库中删除用户 。
- 执行
DBCC FREESYSTEMCACHE('TokenAndPermUserStore')以清除数据库上的安全缓存。 - 执行
DBCC FLUSHAUTHCACHE以清除联合身份验证上下文缓存。 - 基于登录名创建用户。
Microsoft Entra 组服务器主体限制
以下是Azure SQL 数据库和Azure Synapse Analytics中Microsoft Entra组登录的已知限制:
- Microsoft Entra 组不支持 Azure SQL 数据库服务器角色。
- 如果 SQL 管理员属于 Microsoft Entra 组,则该组的用户连接时会有一些限制。 每个单独的 Microsoft Entra 用户都不属于
sys.server_principals表的一部分。 这会产生各种后果,包括对SUSER_SID的调用会返回NULL。 - 作为 Microsoft Entra 组登录名的一部分的 Microsoft Entra 用户登录名也不会隐式创建,这意味着这些登录名没有默认架构,并且在创建 Microsoft Entra 用户的登录名或为该组分配默认架构之前无法执行
CREATE SCHEMA等操作。 - 不支持将数据库所有者更改为 Microsoft Entra 组。
ALTER AUTHORIZATION ON database::<mydb> TO [my_aad_group]失败并出现错误消息:Msg 33181, Level 16, State 1, Line 4 The new owner cannot be Azure Active Directory group.