Compartir a través de

教程:创建和使用 Microsoft Entra 服务器登录名

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

本文指导你在 Azure SQL 的虚拟 数据库中创建和使用由 Microsoft Entra ID(旧称 Azure Active Directory)支持的master

本教程介绍如何执行下列操作:

  • 使用 Azure SQL 数据库的新语法扩展在虚拟 master 数据库中创建 Microsoft Entra 登录名
  • 在虚拟 master 数据库中创建映射到 Microsoft Entra 登录名的用户
  • 使用 WITH OBJECT_ID 语法用于非唯一显示名称
  • 向 Microsoft Entra 用户授予服务器角色
  • 禁用 Microsoft Entra 登录名

注意

对于 Azure SQL 数据库,Microsoft Entra 服务器主体(登录名)当前为公共预览版。 Azure SQL 托管实例和 SQL Server 2022 及更高版本已经可以全面使用 Microsoft Entra 登录名。

先决条件

注意

对于在 Microsoft Entra ID(特别是服务主体)中处理不唯一的显示名称的组织,请确保获取计划为其创建登录名的任何服务主体的可用对象 ID 信息。 语法 WITH OBJECT_ID 扩展可以帮助解决这些情境。

创建 Microsoft Entra 登录名

  1. 为 Microsoft Entra 帐户创建 Azure SQL 数据库登录名。 在示例中,我们将使用名为 bob@contoso.com 的 Microsoft Entra 域中的 contoso。 还可以从 Microsoft Entra 组或服务主体(应用程序)创建登录名。 例如,mygroup 是一个 Microsoft Entra 组,由属于该组的 Microsoft Entra 帐户组成。 有关详细信息,请参阅 CREATE LOGIN (Transact-SQL)

    注意

    第一个 Microsoft Entra 登录名必须由 Microsoft Entra 管理员创建。Microsoft Entra 管理员可以是 Microsoft Entra 用户或组。 SQL 登录名无法创建Microsoft Entra 登录名。

    提示

    如果在 Microsoft Entra ID 中遇到非统一显示名称的问题,则可以使用 WITH OBJECT_ID 语法扩展。 此功能对于具有重复显示名称的服务主体特别有用。 例如:

    CREATE LOGIN [myapp4466e] FROM EXTERNAL PROVIDER 
      WITH OBJECT_ID = 'aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb'
    

    有关详细信息,请参阅 Microsoft Entra 登录名和具有非统一显示名称的用户

  2. 通过 SQL Server Management Studio (SSMS) 使用为服务器设置的 Microsoft Entra 管理员帐户登录到 SQL 数据库。

  3. 展开数据库>系统数据库。 右键单击 master 数据库,然后选择 “新建查询”,以在 master 数据库的上下文中打开新的查询窗口。

  4. 运行以下查询:

    CREATE LOGIN [bob@contoso.com] FROM EXTERNAL PROVIDER
    GO
    
  5. sys.server_principals 中检查创建的登录名。 执行以下查询:

    SELECT name, type_desc, type, is_disabled
    FROM sys.server_principals
    WHERE type_desc like 'external%'
    

    你将看到如下所示的输出:

    Name                            type_desc       type   is_disabled
    bob@contoso.com                 EXTERNAL_LOGIN  E      0
    
  6. bob@contoso.com 登录名已在虚拟 master 数据库中创建。

使用 Microsoft Entra 登录名创建用户

  1. 创建 Microsoft Entra 登录名后,可以创建一个映射到虚拟 master 数据库中的 Microsoft Entra 登录名的数据库级 Microsoft Entra 用户。 继续使用示例 bob@contoso.com 在虚拟 master 数据库中创建一个用户,因为我们要演示如何将用户添加到特殊角色。 只有 Microsoft Entra 管理员或 SQL 服务器管理员才能在虚拟 master 数据库中创建用户。

  2. 我们仍使用虚拟 master 数据库,但如果你想在其他数据库中创建用户,可以重新连接到你选择的数据库。 运行以下查询。

    CREATE USER [bob@contoso.com] FROM LOGIN [bob@contoso.com]
    

    提示

    尽管不需要使用 Microsoft Entra 用户别名(例如 bob@contoso.com),但建议将同一别名用于 Microsoft Entra 用户和Microsoft Entra 登录名。

    如果需要直接从具有特定对象 ID 的外部提供程序创建用户(例如,若要解决非统一显示名称问题),也可以使用:

    CREATE USER [user_name] FROM EXTERNAL PROVIDER 
      WITH OBJECT_ID = 'objectid'
    
  3. sys.database_principals 中检查创建的用户。 执行以下查询:

    SELECT name, type_desc, type
    FROM sys.database_principals
    WHERE type_desc like 'external%'
    

    你将看到如下所示的输出:

    Name                            type_desc       type
    bob@contoso.com                 EXTERNAL_USER   E
    

注意

仍支持在不登录 Microsoft Entra 的情况下创建 Microsoft Entra 用户的现有语法。 执行以下语法将在您连接到的特定数据库中创建一个数据库包含用户。 重要的是,即使虚拟master数据库中存在同名的登录,此用户也不会关联到任何登录。

例如 CREATE USER [bob@contoso.com] FROM EXTERNAL PROVIDER

可以使用具有非唯一显示名称的服务主体创建 Microsoft Entra 登录名。 有关详细信息,请参阅具有非唯一显示名称的 Microsoft Entra 登录名和用户

向 Microsoft Entra 登录名授予服务器级角色

可将登录名添加到固定服务器级角色,例如 数据库中的 ##MS_DefinitionReader####MS_ServerStateReader##master 角色。

注意

Microsoft Entra 组不支持此处提到的服务器级角色。

ALTER SERVER ROLE ##MS_DefinitionReader## ADD MEMBER [AzureAD_object];
ALTER SERVER ROLE ##MS_ServerStateReader## ADD MEMBER [AzureAD_object];
ALTER SERVER ROLE ##MS_ServerStateManager## ADD MEMBER [AzureAD_object];

在用户重新连接之前,权限不会生效。 另外请刷新 DBCC 缓存:

DBCC FLUSHAUTHCACHE
DBCC FREESYSTEMCACHE('TokenAndPermUserStore') WITH NO_INFOMSGS

若要检查哪些 Microsoft Entra 登录名是服务器级角色的一部分,请运行以下查询:

SELECT roles.principal_id AS RolePID,roles.name AS RolePName,
       server_role_members.member_principal_id AS MemberPID, members.name AS MemberPName
       FROM sys.server_role_members AS server_role_members
       INNER JOIN sys.server_principals AS roles
       ON server_role_members.role_principal_id = roles.principal_id
       INNER JOIN sys.server_principals AS members
       ON server_role_members.member_principal_id = members.principal_id;

为 Microsoft Entra 用户授予特殊角色

SQL 数据库的特殊角色可以分配给虚拟 master 数据库中的用户。

要将特殊数据库角色之一授予用户,该用户必须存在于虚拟 master 数据库中。

若要将用户添加到角色,可运行以下查询:

ALTER ROLE [dbmanager] ADD MEMBER [AzureAD_object]

若要从角色中删除用户,请运行以下查询:

ALTER ROLE [dbmanager] DROP MEMBER [AzureAD_object]

AzureAD_object 可以是 Microsoft Entra ID 中的 Microsoft Entra 用户、组或服务主体。

在示例中,我们创建了用户 bob@contoso.com。 让我们为该用户分配 dbmanager 和 loginmanager 角色。

  1. 运行以下查询:

    ALTER ROLE [dbmanager] ADD MEMBER [bob@contoso.com]
    ALTER ROLE [loginmanager] ADD MEMBER [bob@contoso.com]
    
  2. 运行以下查询检查数据库角色分配:

    SELECT DP1.name AS DatabaseRoleName,
      isnull (DP2.name, 'No members') AS DatabaseUserName
    FROM sys.database_role_members AS DRM
    RIGHT OUTER JOIN sys.database_principals AS DP1
      ON DRM.role_principal_id = DP1.principal_id
    LEFT OUTER JOIN sys.database_principals AS DP2
      ON DRM.member_principal_id = DP2.principal_id
    WHERE DP1.type = 'R'and DP2.name like 'bob%'
    

    你将看到如下所示的输出:

    DatabaseRoleName       DatabaseUserName
    dbmanager              bob@contoso.com
    loginmanager           bob@contoso.com
    

可选 - 禁用登录名

ALTER LOGIN (Transact-SQL) DDL 语法可用于在 Azure SQL 数据库中启用或禁用 Microsoft Entra 登录名。

ALTER LOGIN [bob@contoso.com] DISABLE

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

DBCC FLUSHAUTHCACHE
DBCC FREESYSTEMCACHE('TokenAndPermUserStore') WITH NO_INFOMSGS

执行以下查询,检查是否已禁用该登录名:

SELECT name, type_desc, type
FROM sys.server_principals
WHERE is_disabled = 1

此功能的一个用例是允许对异地副本进行只读操作,但拒绝在主服务器上进行连接。