教程:创建和使用 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 登录名。
先决条件
- 一个包含数据库的 SQL 数据库或 SQL 托管实例。 如果尚未创建 Azure SQL 数据库,请参阅快速入门:创建 Azure SQL 数据库单一数据库;或参阅快速入门:创建 Azure SQL 托管实例。
- 为 SQL 数据库或 SQL 托管实例设置的 Microsoft Entra 身份验证。 有关详细信息,请参阅使用 Azure SQL 配置和管理 Microsoft Entra 身份验证。
- 本文指导你在虚拟
master
数据库中创建 Microsoft Entra 登录名和用户。 只有 Microsoft Entra 管理员才能在虚拟master
数据库中创建用户,因此建议在完成本教程时使用 Microsoft Entra 管理员帐户。 具有loginmanager
角色的 Microsoft Entra 主体可以在虚拟master
数据库中创建登录名,但不能创建用户。
创建 Microsoft Entra 登录名
为 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 登录名。
通过 SQL Server Management Studio (SSMS) 使用为服务器设置的 Microsoft Entra 管理员帐户登录到 SQL 数据库。
运行以下查询:
Use master CREATE LOGIN [bob@contoso.com] FROM EXTERNAL PROVIDER GO
在
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
bob@contoso.com
登录名已在虚拟master
数据库中创建。
使用 Microsoft Entra 登录名创建用户
创建 Microsoft Entra 登录名后,可以创建一个映射到虚拟
master
数据库中的 Microsoft Entra 登录名的数据库级 Microsoft Entra 用户。 继续使用示例bob@contoso.com
在虚拟master
数据库中创建一个用户,因为我们要演示如何将用户添加到特殊角色。 只有 Microsoft Entra 管理员或 SQL 服务器管理员才能在虚拟master
数据库中创建用户。我们使用的是虚拟
master
数据库,但如果你想在其他数据库中创建用户,可以切换到你选择的数据库。 运行以下查询。Use master CREATE USER [bob@contoso.com] FROM LOGIN [bob@contoso.com]
提示
尽管不一定非要使用 Microsoft Entra 用户别名(例如
bob@contoso.com
),但建议的最佳做法是为 Microsoft Entra 用户和 Microsoft Entra 登录名使用同一别名。在
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 角色。
运行以下查询:
ALTER ROLE [dbmanager] ADD MEMBER [bob@contoso.com] ALTER ROLE [loginmanager] ADD MEMBER [bob@contoso.com]
运行以下查询检查数据库角色分配:
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
要使 DISABLE
或 ENABLE
更改立即生效,必须使用以下 T-SQL 命令清除身份验证缓存和 TokenAndPermUserStore 缓存:
DBCC FLUSHAUTHCACHE
DBCC FREESYSTEMCACHE('TokenAndPermUserStore') WITH NO_INFOMSGS
执行以下查询,检查是否已禁用该登录名:
SELECT name, type_desc, type
FROM sys.server_principals
WHERE is_disabled = 1
此功能的一个用例是允许对异地副本进行只读操作,但拒绝在主服务器上进行连接。