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

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

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

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

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

注意

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

先决条件

创建 Microsoft Entra 登录名

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

    注意

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

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

  3. 运行以下查询:

    Use master
    CREATE LOGIN [bob@contoso.com] FROM EXTERNAL PROVIDER
    GO
    
  4. 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
    
  5. bob@contoso.com 登录名已在虚拟 master 数据库中创建。

使用 Microsoft Entra 登录名创建用户

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

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

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

    提示

    尽管不一定非要使用 Microsoft Entra 用户别名(例如 bob@contoso.com),但建议的最佳做法是为 Microsoft Entra 用户和 Microsoft Entra 登录名使用同一别名。

  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## 或 ##MS_ServerStateManager## 角色。

注意

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

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