Compartir a través de

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

适用于:Azure SQL 数据库

本文介绍在不授予对主要副本或其他命名副本的访问权限的情况下,向 Azure SQL 数据库超大规模命名副本授予访问权限的过程。 此方案允许命名副本的资源和安全隔离(因为命名副本将使用自己的计算节点运行),并且每当需要对 Azure SQL 超大规模数据库的独立只读访问时,它都很有用。 在此上下文中,独立意味着 CPU 和内存不会在主副本和命名副本之间共享,在命名副本上运行的查询不使用主副本或任何其他副本的计算资源,访问命名副本的主体无法访问其他副本,包括主副本。

注意

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

在主服务器上创建登录名

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

<password>替换为强密码

CREATE LOGIN [third-party-login]
    WITH PASSWORD = '<password>';

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

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

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

ALTER LOGIN [third-party-login] DISABLE;

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

创建登录名后,连接到数据库的主读写副本。 例如,使用WideWorldImporters中提供的详细信息进行还原。 然后,为该登录名创建数据库用户:

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

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

DROP LOGIN [third-party-login];

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

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

替换为 <password> 强密码。 例如,使用 Azure CLI:

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

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

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

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

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

CREATE LOGIN [third-party-login] WITH PASSWORD = '<password>', 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 用户身份连接到主要副本。 替换为 <password> 强密码。

sqlcmd -S MyPrimaryServer.database.chinacloudapi.cn -U third-party-login -P <password> -d WideWorldImporters

这将导致错误,因为不允许用户连接到服务器:

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

尝试连接到命名副本成功。 替换为 <password> 强密码。

sqlcmd -S MyNamedReplicaServer.database.chinacloudapi.cn -U third-party-login -P <password> -d WideWorldImporters_NR

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