在我们从简单的 Windows 更新引起的机器重启中恢复后,SQL Server 2005 从我们的一个镜像数据库中删除了一个用户。
我检查了一下,登录名不在镜像服务器中(它在主服务器中)。如果系统经历了故障转移,这是否可以解释为什么在恢复到主服务器时用户被从用户数据库中删除?我在文档中找不到任何表明 SQL Server 将删除孤立用户的内容(http://msdn.microsoft.com/en-us/library/ms175475%28SQL.90%29.aspx)。我应该在日志中查找什么吗?
编辑:失败前的设置:PRIMARY - 登录成功。数据库中的用户成功。MIRROR - 登录不存在。数据库中不存在用户。
失败后:PRIMARY - 登录成功。数据库中不存在用户。MIRROR - 登录不存在。数据库中不存在用户。
编辑:上周 WINDOWS UPDATES 重启后,恢复数据库系统后,我们发现其中一个表中缺少一个触发器,另一个用户也缺少触发器。我 100% 确信这不是我们造成的(我们只有两个 sa,我是其中一个)。到底发生了什么?这肯定是 SQL Server 2005 镜像的一个错误。
答案1
这是我所认为发生的事情,这是基于您在 orphaned-user 问题标签中的猜测,所以我可能是错的。
- 您的数据库已从主数据库故障转移到镜像数据库。
- 镜像(现在为主服务器)上的数据库服务器没有从主服务器脚本中取出登录名,而是将其创建为新登录名。这意味着 sid 不匹配,因此故障转移后用户登录时会出现问题。
- 运行修复登录问题的
sp_change_users_login 'Update_One'
命令来修复登录问题。这将更改数据库中的用户 sid,使其与数据库服务器上的登录 sid 相匹配。 - 数据库再次发生故障转移。现在,数据库服务器上的登录 SID 不再匹配。该怎么办?
sp_change_users_login
再次使用 来解决问题。
应该发生什么:
参与镜像的数据库中使用的主体登录信息被编写到镜像中(如 mr denny 所建议的那样)。最简单的方法是使用帮助 您还可以使用SSIS 传输登录任务。
数据库服务器登录的 sid 可在 sys.server_principals 中看到。数据库用户的 sid 可在 sys.database_principals 中看到。检查这些以确保没有不匹配的情况。
答案2
镜像服务器是否曾创建过登录?如果没有,您需要从主系统编写登录脚本,以便 SID 匹配。
答案3
用户可能在镜像数据库中,只是没有同步到登录名。如果在设置镜像时用户在那里,即使登录名不存在,SQL Server 也不会删除它。它在那里。
如果您稍后添加它,它将在镜像中移动。不是登录名,而是 CREATE USER 将被转移。