Microsoft Entra 服务器主体

适用于: Azure SQL 数据库 Azure SQL 托管实例 Azure Synapse Analytics(仅限专用 SQL 池)

你现可创建和使用 Microsoft Entra ID(旧称 Azure Active Directory)服务器主体,它们是 SQL 数据库的虚拟 master 数据库中的登录名。 将 Microsoft Entra 服务器主体用于 SQL 数据库可以获得多项优势:

  • 支持用于权限管理的 Azure SQL 数据库服务器角色
  • 支持具有 SQL 数据库特殊角色(例如 loginmanagerdbmanager 角色)的多个 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 身份验证

注意

对于 Azure SQL 数据库和 Azure Synapse Analytics,Microsoft Entra 服务器主体(登录名)当前为公共预览版。 Microsoft Entra 登录名通常可用于 Azure SQL 托管实例和 SQL Server 2022。

权限

在虚拟 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_principalssys.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 管理员组)。

  • 要使 DISABLEENABLE 更改立即生效,必须使用 T-SQL 命令清除身份验证缓存和 TokenAndPermUserStore 缓存。

    DBCC FLUSHAUTHCACHE
    DBCC FREESYSTEMCACHE('TokenAndPermUserStore') WITH NO_INFOMSGS 
    

Microsoft Entra 主体的角色

SQL 数据库的特殊角色可分配给 Microsoft Entra 主体(包括 dbmanager 和 loginmanager)的虚拟 master 数据库中的用户

Azure SQL 数据库服务器角色可分配给虚拟 master 数据库中的登录名。

有关如何授予这些角色的教程,请参阅教程:创建和使用 Microsoft Entra 服务器登录名

限制和备注

  • SQL Server 管理员无法在任何数据库中创建 Microsoft Entra 登录名或用户。
  • SQL 管理员或 SQL 用户不能执行下列 Microsoft Entra 操作:
    • CREATE LOGIN [bob@contoso.com] FROM EXTERNAL PROVIDER
    • CREATE USER [bob@contoso.com] FROM EXTERNAL PROVIDER
    • EXECUTE AS USER [bob@contoso.com]
    • ALTER AUTHORIZATION ON securable::name TO [bob@contoso.com]
  • Azure SQL 数据库和 Azure Synapse Analytics 不支持模拟 Microsoft Entra 服务器主体(登录名)。 Azure SQL 托管实例支持
  • 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 和 Azure Data Studio 中,如果 master 中已有相同的 Microsoft Entra 登录名,则创建用户的脚本命令不会进行检查。 它始终会为包含的数据库 Microsoft Entra 用户生成 T-SQL。
  • 如果你尝试从具有非唯一显示名称的服务主体创建登录名或用户,则可能会出现错误。 有关缓解此错误的详细信息,请参阅具有非唯一显示名称的 Microsoft Entra 登录名和用户

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.
      

后续步骤