我们有一个独特的情况,我们希望允许用户使用 SSMS 查询数据库的可读辅助副本以进行临时报告,但不允许他们从主副本中读取。我们已经设置了只读路由来实现这一点。这也是 SQL 2016 上的全部内容。
我最初的想法是在主副本和辅助副本上创建登录名,并授予对相关数据库的读取访问权限。然后我们会拒绝连接或禁用当前主副本上的登录。在 SSMS 中,用户可以使用 ApplicationIntent=ReadOnly 连接到侦听器并被路由到辅助副本,而无需接触主副本。
我们将使用基本逻辑在主副本服务器和辅助副本服务器上设置一个简单的作业:如果当前服务器 = 主然后禁用登录;如果当前服务器 = 辅助服务器,则启用登录。
问题是当登录在主服务器上被禁用时,我在连接到具有只读意图的侦听器时登录失败。当我在主副本上重新启用登录时,它工作得很好,并且连接被正确路由到可读的辅助副本。
我在主服务器上设置了一个跟踪,果然,我可以看到登录连接并在主副本上的 master 和 msdb 中运行一些系统类型查询——即使我在 SSMS 中使用 ApplicationIntent=ReadOnly 连接。我不确定这是否是 SSMS 在幕后所做的事情,或者它是否是通过只读路由过程的登录的默认行为。
以下是我在主数据库上使用快速分析器跟踪捕获的查询:
--msdb query
select
case
when object_id('dbo.sysdac_instances') is not null then 1
else
0
end
--master query
SELECT
dtb.name AS [Name],
dtb.database_id AS [ID],
CAST(has_dbaccess(dtb.name) AS bit) AS [IsAccessible]
FROM
master.sys.databases AS dtb
ORDER BY
[Name] ASC
以前有人处理过这种情况吗?看来我们基本上需要允许主副本上的登录连接权限,同时拒绝它对主副本上 AG 中的数据库的读取访问权限,但授予该登录权限以读取可读辅助副本上的数据库。
另一种选择是创建一个直接指向辅助副本的 DNS 条目,但我们不能保证副本始终是辅助副本,因为可能会发生故障转移。