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

5ar*_*arx 11 sql-server-2008 sql-server backup permissions restore

我不得不将几个 SQL Server 2008 数据库移动到我们的新 db 服务器,所以我将它们全部备份(到 .bak 文件),将这些文件复制到新盒子并恢复它们(全部使用 SQL Management Studio 完成)。

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

我有这个想法,用户和权限都将无缝复制到新的数据库服务器上,但似乎某处出了问题。我将不胜感激评论/建议/提供帮助;-)

Jef*_*eff 7

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

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

/sf/ask/32296981/

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

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


gbn*_*gbn 6

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

  1. 如果可以,将原始 master 数据库还原为“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')
Run Code Online (Sandbox Code Playgroud)


SQL*_*tar 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 
Run Code Online (Sandbox Code Playgroud)

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