为超大规模命名副本配置独立访问

适用于:Azure SQL 数据库

本文介绍在不授予对主要副本或其他命名副本的访问权限的情况下,向 Azure SQL 数据库超大规模命名副本授予访问权限的过程。 此方案能使命名副本的资源和安全独立(因为命名副本将使用其自身的计算节点运行),每当需要对 Azure SQL 超大规模数据库进行独立的只读访问时,此方案就非常有用。 在此上下文中,“独立”是指主要副本与命名副本之间不共享 CPU 和内存,针对命名副本运行的查询不会使用主要副本或任何其他副本的计算资源,访问命名副本的主体无法访问其他副本(包括主要副本)。

注意

Microsoft Entra ID 以前称为 Azure Active Directory (Azure AD)。

在主服务器上创建登录名

在托管数据库的逻辑服务器上的 master 数据库中,执行以下命令以创建一个新登录名。

使用自己的强密码和唯一密码,将 strong_password_here 替换为强密码。

CREATE LOGIN [third-party-login] WITH PASSWORD = 'strong_password_here';

sys.sql_logins 系统视图中检索所创建的登录名的 SID 十六进制值:

SELECT SID FROM sys.sql_logins WHERE name = 'third-party-login';

禁用登录名。 这会阻止此登录名访问托管在主要副本上的服务器中的任何数据库。

ALTER LOGIN [third-party-login] DISABLE;

在主要读/写数据库中创建用户

创建登录名后,连接到数据库的主要读/写副本,例如 WideWorldImporters(可以在在 Azure SQL 中还原数据库找到用于还原数据库的示例脚本),并为该登录名创建数据库用户:

CREATE USER [third-party-user] FROM LOGIN [third-party-login];

作为可选步骤,创建数据库用户后,就可删除在上一步骤中创建的服务器登录名,前提是存在以任何方式重新启用的登录名。 连接到托管主数据库的逻辑服务器上的 master 数据库,然后执行以下示例脚本:

DROP LOGIN [third-party-login];

在不同的逻辑服务器上创建命名副本

创建新的 Azure SQL 逻辑服务器,以将其用于对命名副本进行独立访问。 请遵循在 Azure SQL 数据库中创建和管理服务器和单一数据库中提供的说明。 若要创建命名副本,此服务器必须与承载主要副本的服务器位于同一 Azure 区域中。

在以下示例中,将 strong_password_here 替换为强密码。 例如,使用 Azure CLI:

az sql server create -g MyResourceGroup -n MyNamedReplicaServer -l MyLocation --admin-user MyAdminUser --admin-password strong_password_here

然后,为此服务器上的主数据库创建命名副本。 例如,使用 Azure CLI:

az sql db replica create -g MyResourceGroup -n WideWorldImporters -s MyPrimaryServer --secondary-type Named --partner-database WideWorldImporters_NR --partner-server MyNamedReplicaServer

在命名副本服务器上创建登录名

连接到在上一步中创建的托管命名副本的逻辑服务器上的 master 数据库。 将 strong_password_here 替换为强密码。 使用从主要副本中检索到的 SID 添加登录名:

CREATE LOGIN [third-party-login] WITH PASSWORD = 'strong_password_here', sid = 0x0...1234;

此时,使用 third-party-loginbob@contoso.com 的用户和应用程序可以连接到命名副本,但不能连接到主要副本。

授予数据库中的对象级权限

按照说明设置登录身份验证后,可以使用普通的 GRANTDENYREVOKE 语句来管理授权或数据库中的对象级权限。 在这些语句中,引用你在数据库中创建的用户的名称,或者引用包含此用户作为成员的数据库角色。 请记得在主要副本上执行这些命令。 这些更改将传播到所有次要副本,但它们仅在创建服务器级登录名的命名副本上有效。

请记住,默认情况下,新创建的用户只被授予最小的权限集(例如,它不能访问任何用户表)。 如果要允许 third-party-userbob@contoso.com 读取表中的数据,需要显式授予 SELECT 权限:

GRANT SELECT ON [Application].[Cities] to [third-party-user];

作为单独授予每个表的权限的替代方法,你可以将该用户添加到 db_datareaders 数据库角色,以允许对所有表进行读取访问,也可以使用架构允许访问架构中的所有现有表和新表。

测试访问权限

可通过使用任意客户端工具来试用安全配置,并尝试连接到主要副本和命名副本。 例如,可以使用 sqlcmd 尝试以 third-party-login 用户身份连接到主要副本。 将 strong_password_here 替换为强密码。

sqlcmd -S MyPrimaryServer.database.chinacloudapi.cn -U third-party-login -P strong_password_here -d WideWorldImporters

因为不允许该用户连接到服务器,这会导致出错:

Sqlcmd: Error: Microsoft ODBC Driver 13 for SQL Server : Login failed for user 'third-party-login'. Reason: The account is disabled.

尝试连接到命名副本成功。 将 strong_password_here 替换为强密码。

sqlcmd -S MyNamedReplicaServer.database.chinacloudapi.cn -U third-party-login -P strong_password_here -d WideWorldImporters_NR

无错误返回,并且经已授予的对象级别权限的允许,可以在命名副本上执行查询。