我已经将数据库从 SQL 2000 移至新的 2005 服务器。在我以某个特定用户身份登录 SQL Server Management Studio 之前,一切都很顺利。看起来我已成功登录,但当我尝试扩展数据库时,我收到“数据库无法访问”的消息。我可以使用 Windows 身份验证和其他 SQL 用户登录,没有任何问题,并且可以看到所有内容。
我检查并确保数据库不处于单用户模式。我还检查了孤立登录(exec sp_change_users_login 'report'),但未发现任何孤立登录。用户也拥有数据库的权限。
如能得到任何能为我指明正确方向的帮助,我将不胜感激。
答案1
最有可能的是新服务器上的权限问题。您的 SQL 登录名不会自动延续,如果您在新服务器上手动创建它,它将获得不同的 SID,这与被授予数据库访问权限的 SID 不一致。
最好的方法是使用 sp_help_revlogin(如果链接失效,请使用 KB918992)生成旧服务器上的登录脚本,然后在新服务器上运行该脚本。此过程将把 SID 和密码信息转移到新服务器,从而有效地在新服务器上重新创建登录。完成此操作后,数据库中设置的权限应与新服务器上的登录同步。
由于 SQL 从 Windows 获取 SID,因此这对于 Windows 登录来说应该不是问题,尽管您仍然需要在新服务器上设置 Windows 登录。sp_help_revlogin 也会为您处理这部分。
答案2
感谢大家的回复!经过一段时间的折腾,我从数据库中删除了用户并重新创建了它,成功了!我之前也删除过用户并重新创建过,但之前我是在服务器级别而不是数据库级别进行的。一旦我从数据库中删除用户并重新创建它,它就可以正常工作了。再次感谢您的帮助!
答案3
您不会遇到基于 Windows 的登录问题,因为它们没有通过 SID 与数据库关联。SQL 登录存在这种情况,因此会导致“孤立”。最好的办法是使用 sp_help_revlogin(主动)或使用 sp_change_users_login(被动)。我在几年前发现 sp_help_revlogin 之前一直使用以下脚本。这仍然有效:
DECLARE @user SYSNAME
DECLARE @SQL NVARCHAR(300)
DECLARE cur_Users CURSOR FOR
SELECT name
FROM sysusers
WHERE islogin = 1
AND isntname = 0
AND NAME NOT IN ('guest', 'dbo', 'sys', 'INFORMATION_SCHEMA')
ORDER BY name
OPEN cur_Users
FETCH NEXT
FROM cur_Users INTO @user
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @SQL = 'EXEC sp_change_users_login ' + '''' + 'UPDATE_ONE'
+ '''' + ', ' + '''' + @user + '''' + ', ' + '''' + @user + ''''
EXEC sp_executesql @SQL
FETCH NEXT
FROM cur_Users INTO @user
END
CLOSE cur_Users
DEALLOCATE cur_Users
答案4
这是升级还是您分离并重新连接?如果您分离数据库并将其移动到另一台服务器,用户将出现在数据库中,但他们不一定能获得安全挂钩。您可能需要重置他们在服务器上的权限,或者删除用户并重新创建它。