备份->恢复操作后混乱的用户权限


11

我不得不将几个SQL Server 2008数据库移动到我们的新数据库服务器,因此我将它们全部备份(到.bak文件),将这些文件复制到新框中并还原它们(所有操作都使用SQL Management Studio完成)。

一切正常,但是现在我发现我无法使用继续在旧RDBMS上运行的SQL Server帐户登录任何数据库。我的Windows身份验证登录仍然可以正常工作。

我有这样的想法,用户和权限都可以无缝地复制到新的数据库服务器上,但是似乎某个地方出了问题。我将不胜感激/建议/建议;-)

Answers:


7

我看到您已经找到了解决问题的方法,我在原始问题中注意到的一件事是您仍然可以访问旧服务器。

以下关于SO的问题有一个类似的问题,并且包含指向Microsoft文章的链接,该文章带有用于生成用户权限的脚本。

/programming/461385/restoring-a-backup-to-a-different-server-user-permissions

(针对该问题列出的资源http://support.microsoft.com/kb/918992

听起来好像将服务器设置从Windows身份验证更改为混合模式身份验证可以解决您的问题,但是以防万一它不能完全解决问题,我认为这可能很有用。


我敢肯定这不会是我第一次与SQL Server争夺用户/权限,因此我将其标记为后代。非常感谢您的发布。
5arx 2011年

6

这被称为“孤立用户”。这是2种修复方法

  1. 如果可以,请将原始主数据库还原为“ loginsource”,并且sys.server_principals具有足够的信息来生成所有SQL Server和Windows登录名。也就是说,SID和加密的密码

  2. 如果仅使用Windows登录名,则可以针对每个数据库运行此命令以生成脚本

脚本:

SELECT
    'CREATE LOGIN [' + SUSER_SNAME(sid) + '] FROM WINDOWS'
FROM
    sys.database_principals
WHERE
    [type] IN ('G', 'U')

感谢您的回复-我的Web应用程序使用SQL登录名,而我们的Windows帐户用于管理。我看不到您建议的还原为'loginsource'的方法-您能否详细说明?我希望可以使用Managment Studio完成所有操作?
5arx 2011年

PS。我遵循以下文档:support.microsoft.com/kb/274188 并成功运行了所有脚本(显然)。但是什么都没有改变。
5arx 2011年

5

理想情况下,您将在执行还原之前将用户和权限脚本化。如果那没有发生,那么您需要在事实发生后再进行修复,并且可能会错过一些机会,但是您应该能够达到目标的90%。

您需要确定的第一件事是新服务器上是否存在相同的登录名。如果没有,则应该确定是否可以在新服务器上创建登录名。永远不要以为应该创建它们,原因很可能是为什么它们最初不存在。然后,您可以通过浏览sysusers表来创建它们。

您可以通过运行类似于以下内容的方式来修复孤立的用户:

DECLARE @username varchar(25), @loginsid varbinary(85)
DECLARE fixusers CURSOR
FOR
SELECT UserName = name 
    FROM sysusers
    WHERE issqluser = 1 
    and (sid is not null and sid <> 0x0)
    and suser_sname(sid) is null
    and name in (select name from master..syslogins)
    ORDER BY name
OPEN fixusers
FETCH NEXT FROM fixusers
INTO @username
WHILE @@FETCH_STATUS = 0
BEGIN
    EXEC sp_change_users_login 'update_one', @username, @username

    FETCH NEXT FROM fixusers
    INTO @username
END CLOSE fixusers
DEALLOCATE fixusers 

该代码适用于SQL2008,但编写为与SQL2000向后兼容。


感谢您的脚本。我可以假定在Management Studio中无法执行此操作吗?另外,有人建议我删除并重新创建数据库级别的用户-建议这样做吗?
5arx 2011年

这是假定登录已经存在,只是mataches的SID
GBN

sp_change_users_login不会更新SID吗?msdn.microsoft.com/zh-CN/library/ms174378.aspx
SQLRockstar 2011年

5arx-SSMS中无法执行此操作。就像我说的那样,在理想情况下,您应该在还原之前编写权限脚本。在这一点上,您要么需要手动重新创建,要么尝试手动将它们拼凑在一起。如果我是您,我将还原旧数据库,脚本出权限,从另一台服务器进行还原,然后重做您的权限。
SQLRockstar 2011年

“ Update_One:将当前数据库中的指定用户链接到现有SQL Server登录名。必须指定用户和登录名。密码必须为NULL或未指定。” 因此,它假定登录名已经存在。
gbn


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.