我有 2 个运行 SQL Server 2016 的盒子,并使用 Always On Availability 进行设置。我设置了一个侦听器来选择在发生故障转移时要与哪个服务器通信,这似乎工作正常,除了我使用的是混合身份验证,而且我的连接字符串使用的是 SQL Server 身份验证用户而不是窗户一个。
例如,我的应用程序中的连接字符串是:
Database=MySQLServer;Server=AGListener;User Id=sqluser;Password=XXXXXXX;
当我针对主要对象工作时,这很好用。当我故障转移到辅助数据库时,出现“sqluser 对数据库没有任何权限”的错误。如果我在辅助服务器上运行以下脚本:
EXEC sp_change_users_login 'Update_One', 'sqluser', 'sqluser'
然后它再次正常工作,但是当我故障转移回原始主服务器时,我再次收到错误消息。看起来在每次故障转移时,我都必须运行更新用户脚本才能使连接字符串起作用。
在 AG 环境中对连接字符串使用 SQL Server 身份验证不是一个好主意吗?还是我缺少一个步骤?我希望我的故障转移是自动的,而不是每次都需要记住运行脚本。
在托管副本的实例上创建登录,指定与托管主实例相同的 SID:
来自:解决孤立用户问题 (SQL Server)
或者使用包含的数据库用户: