我们创建了一个仅用于报告的 SQL 登录帐户 (SSRS),我们将其称为“ MyReportAcct ”。
我们已经使用这个帐户一段时间了,它是为每个新安装的实例创建的。除了在几个镜像实例上之外,它一直在按您的预期工作。我在我的环境中的任何独立实例上都没有看到这个问题。
根据我们的变更管理、Windows 日志和 SQL 错误日志的内部流程,报告将随机停止工作并且没有任何更改。以下是我们收到的两条错误消息:
在调查该帐户后,它会显示在 SSMS 的安全对象文件夹下。此外,我们发现该帐户与帐户属性的用户映射下的所有数据库相关联。我已经验证了 ' MyReportAcct ' 有public
and db_datareader
,所以表面上看起来都符合预期。
当我尝试更改帐户或删除映射时,问题就来了。我遇到了:
- 无法更改用户,因为它不存在或您没有权限(错误 15151)。
- 无法删除用户 dbo..(错误 15150)
为了解决这个问题,我必须做的是删除服务器上“ MyReportAcct ”的每个实例,然后重新创建它,然后添加到每个数据库中。这不会一直发生,但经常会让人恼火。此外,我们根本不应该这样做。
我认为我们应该在每个实例中将此帐户更改为 Windows 帐户,而不是本地 SQL 登录。我觉得这可能会解决问题,但我需要证明原因或提供合理的答案。我认为部分问题在于以某种方式进行镜像,但我也不知道如何证明这一点。
安全性是我的一个弱点,我正在采取措施来改变这一点,因此您可以提供的任何见解将不胜感激。如果您需要更多信息,请告诉我。
简短的回答:
' MyReportAcct ' SQL 登录的 SID在每个服务器实例上都不同。
长答案:
该
master
数据库包含每个 SQL Server 实例的安全数据库(想想数据库服务器的 Active Directory)。在这种情况下,我们有两个不同的master
数据库,因为它是一个镜像对。每次创建 SQL 登录时,都会随帐户创建一个不同的 SID,这与 Active Directory 一直以来的工作方式没有什么不同。当镜像数据库故障转移时,数据库中的 SID 与存储在
master
主体服务器 ( SERVER1 ) 的数据库中的 SID 匹配,而不是镜像服务器 ( SERVER2 )。这种自然且默认的故障转移过程会导致 SQL 登录 ( MyReportAcct ) 成为主体服务器 ( SERVER1 ) 上的孤立帐户。每次发生故障转移时都会发生此孤立过程。SQL 登录权限的开始是它们被创建的实例 ( SERVER1 )。到镜像服务器 ( SERVER2 ) 的故障转移现在是不同的权限开始,因此 SID 将不同,因此报告失败的原因。解决方案:
sysadmin
.对我来说听起来像是一个孤立的用户。SID 不匹配。您可以使用以下存储过程来修复孤立登录:
也许您可以创建一个常规作业来同步生产/DR 数据库实例之间的登录,并检查和修复孤立帐户,如下所述: http ://www.msbicoe.com/post/2012/04/05/Automatically-Transfer- and-Synchronize-SQL-Server-logins-SIDs-Passwords-and-Permissions.aspx