包含的数据库用户 - 使数据库可移植

适用于: 是SQL Server(所有支持的版本) 是Azure SQL 数据库 是Azure SQL 托管实例 是Azure Synapse Analytics

使用包含的数据库用户在数据库级别对 SQL Server 和 SQL 数据库 连接进行身份验证。 “包含的数据库”是独立于其他数据库以及承载数据库的 SQL Server/ SQL 数据库 实例(和 master 数据库)的一种数据库。 SQL Server 支持包含的数据库用户进行 Windows 和 SQL Server 身份验证。 使用 SQL 数据库时,将包含的数据库用户与数据库级别防火墙规则相结合。 本主题介绍与传统的登录名/用户模型和 Windows 或服务器级别防火墙规则相比,使用包含的数据库模型的差异和好处。 在特定情况下,可管理性或应用程序业务逻辑可能仍然需要使用传统登录名/用户模型和服务器级别防火墙规则。

备注

随着 Microsoft 发展 SQL 数据库 服务并转向更有保证的 SLA,你可能需要切换到包含的数据库用户模型和数据库范围防火墙规则,以针对给定数据库获得更高可用性的 SLA 和更高的最大登录率。 Microsoft 建议立即考虑进行这类更改。

传统的登录名和用户模型

在传统的连接模型中,通过提供由 Windows 进行身份验证的用户或组凭据,Windows 用户或 Windows 组成员可连接到 数据库引擎 。 也可以同时提供名称和密码,并通过使用 SQL Server 身份验证进行连接。 在这两种情况下,master 数据库必须拥有匹配连接凭据的登录名。 在 数据库引擎 确认了 Windows 身份验证凭据或验证了 SQL Server 身份验证凭据之后,该连接通常会尝试连接到用户数据库。 若要连接到某个用户数据库,登录名必须能够映射到(即关联)用户数据库中的某个数据库用户。 连接字符串还可以指定连接到特定数据库,该数据库在 SQL Server 中为可选但在 SQL 数据库中为必需。

重要原则是登录名(在 master 数据库中)和用户(在用户数据库中)必须存在,并且彼此相关。 这意味着到用户数据库的连接依赖于 master 数据库中的登录名,并且这限制了将数据库移动到其他托管 SQL Server 或 Azure SQL 数据库 服务器的功能。 而且,如果由于任何原因,到 master 数据库的连接不可用(例如,进程中出现故障),整个连接时间将会增加,或者连接可能超时。因此,这可能会降低连接可伸缩性。

包含的数据库用户模型

在包含的数据库用户模型中,master 数据库中不存在登录名。 相反,身份验证过程发生在用户数据库中,并且用户数据库中的数据库用户在 master 数据库中没有关联的登录名。 包含的数据库用户模型支持 Windows 身份验证和 SQL Server 身份验证,并且可以在 SQL Server 和 SQL 数据库中使用。 若要作为包含的数据库用户进行连接,连接字符串必须始终包含用户数据库的参数,以便 数据库引擎 知道哪个数据库负责管理身份验证过程。 包含的数据库用户的活动仅限于验证数据库,因此当作为包含的数据库用户进行连接时,必须在用户将需要的每个数据库中独立创建数据库用户帐户。 若要更改数据库, SQL 数据库 用户必须创建一个新的连接。 如果另一个数据库中存在相同的用户, SQL Server 中的包含的数据库用户可以更改数据库。

Azure: SQL 数据库 和 Azure Synapse Analytics 支持将 Azure Active Directory 标识作为包含的数据库用户。 SQL 数据库 支持包含的数据库用户使用 SQL Server 身份验证,而 Azure Synapse Analytics 不支持。 有关详细信息,请参阅使用 Azure Active Directory 身份验证连接到 SQL 数据库。 使用 Azure Active Directory 身份验证时,可以使用 Active Directory 通用身份验证建立来自 SSMS 的连接。 管理员将通用身份验证配置为需要多重身份验证,这会使用电话呼叫、短信、智能卡 pin 或移动应用通知来验证身份。 有关详细信息,请参阅 SQL 数据库和 Azure Synapse Analytics 针对 Azure AD MFA 的 SSMS 支持

对于 SQL 数据库 和 Azure Synapse Analytics,因为连接字符串中始终需要数据库名称,所以在从传统模型切换到包含的数据库用户模型时,无需更改连接字符串。 对于 SQL Server 连接,如果数据库名称尚不存在,它将必须添加到连接字符串。

重要

在使用传统模型时,服务器级别角色和服务器级别权限可以限制对所有数据库的访问。 在使用包含的数据库模型时,数据库所有者和具有 ALTER ANY USER 权限的数据库用户可以授予对数据库的访问权限。 这将减少高特权服务器登录名的访问控制,并且使访问控制扩大至将高特权数据库用户包含在内。

防火墙

SQL Server

Windows 防火墙规则适用于所有连接,并且对登录名(传统模型连接)和包含的数据库用户具有相同影响。 有关 Windows 防火墙的详细信息,请参阅 为数据库引擎访问配置 Windows 防火墙

SQL 数据库 防火墙

SQL 数据库 允许适用于服务器级别连接(登录名)和适用于数据库级别连接(包含的数据库用户)的单独防火墙规则。 连接到用户数据库时,会首先检查数据库防火墙规则。 如果没有允许访问数据库的规则,则检查服务器级别防火墙规则,这将需要对 SQL 数据库服务器 master 数据库的访问权限。 与包含的数据库用户相结合的数据库级别防火墙规则可以无需在连接过程中访问服务器的 master 数据库,从而提供改进的连接可伸缩性。

有关 SQL 数据库 防火墙规则的详细信息,请参阅以下主题:

语法差异

传统模型 包含的数据库用户模型
连接到 master 数据库时:

CREATE LOGIN login_name WITH PASSWORD = 'strong_password';

随后连接到用户数据库时:

CREATE USER 'user_name' FOR LOGIN 'login_name';
连接到用户数据库时:

CREATE USER user_name WITH PASSWORD = 'strong_password';
传统模型 包含的数据库用户模型
要更改密码,在 master 数据库的上下文中:

ALTER LOGIN login_name WITH PASSWORD = 'strong_password';
要更改密码,在用户数据库的上下文中:

ALTER USER user_name WITH PASSWORD = 'strong_password';

托管实例

在包含的数据库的上下文中,Azure SQL 托管实例的行为与本地 SQL Server 的类似。 创建包含的用户时,请确保将数据库的上下文从主数据库更改为用户数据库。 此外,在设置包含选项时,不应与用户数据库建立活动连接。

例如:

警告

在运行以下脚本之前,请确保托管实例数据库上没有其他连接处于活动状态。 此脚本可能会中断数据库上正在运行的其他进程。

Use MASTER;
GO 

ALTER DATABASE Test
SET RESTRICTED_USER
WITH ROLLBACK IMMEDIATE;

ALTER DATABASE Test
SET containment=partial;

ALTER DATABASE Test
SET MULTI_USER;

USE Test;  
GO 

CREATE USER Carlo  
WITH PASSWORD='Enterpwdhere*'  

SELECT containment_desc FROM sys.databases
WHERE name='Test'

备注

  • 在 SQL Server中,必须为 SQL Server的实例启用包含的数据库用户。 有关详细信息,请参阅 contained database authentication Server Configuration Option
  • 具有非重叠名称的包含的数据库用户和登录名可以在应用程序中共存。
  • 如果 master 数据库中有一个名为 name1 的登录名,并且你创建一个名为 name1 的包含的数据库用户,当在连接字符串中提供数据库名称时,将在连接到数据库的情况下提取登录上下文上的数据库用户上下文。 即,包含的数据库用户将优先使用具有相同名称的登录名。
  • 在 SQL 数据库 中,包含的数据库用户的名称不能与服务器管理员帐户的名称相同。
  • SQL 数据库 服务器管理员帐户绝不能是包含的数据库用户。 服务器管理员具有足够的权限来创建和管理包含的数据库用户。 服务器管理员可以向包含的数据库用户授予针对用户数据库的权限。
  • 由于包含的数据库用户是数据库级别主体,因此需要在会使用它们的每个数据库中创建包含的数据库用户。 标识仅限于数据库,在所有方面都独立于同一台服务器上其他数据库中具有相同名称和相同密码的用户。
  • 使用你通常用于登录名的相同强度密码。

另请参阅

包含的数据库
针对包含数据库的安全性最佳方法
CREATE USER (Transact-SQL)
使用 Azure Active Directory 身份验证连接到 SQL 数据库