5ar*_*arx 11 sql-server-2008 sql-server backup permissions restore
我不得不将几个 SQL Server 2008 数据库移动到我们的新 db 服务器,所以我将它们全部备份(到 .bak 文件),将这些文件复制到新盒子并恢复它们(全部使用 SQL Management Studio 完成)。
一切顺利,但现在我发现我无法使用继续在旧 RDBMS 上工作的 SQL Server 帐户登录任何数据库。顺便说一句,我的 Windows 身份验证登录仍然可以正常工作。
我有这个想法,用户和权限都将无缝复制到新的数据库服务器上,但似乎某处出了问题。我将不胜感激评论/建议/提供帮助;-)
我看到您已经找到了问题的解决方案,我在您的原始问题中注意到的一件事是您仍然可以访问旧服务器。
关于 SO 的以下问题有类似的问题,并包含指向 Microsoft 文章的链接,其中包含生成用户权限的脚本。
(针对该问题列出的资源http://support.microsoft.com/kb/918992)
听起来将服务器设置从 Windows 身份验证更改为混合模式身份验证解决了您的问题,但以防万一它没有完全解决问题,我认为这可能有用。
这被称为“孤立用户”。这里有2种修复方法
如果可以,将原始 master 数据库还原为“loginsource”,并且 sys.server_principals 有足够的信息来生成所有 SQL Server 和 Windows 登录名。即 SID 和加密密码
如果您只使用 Windows 登录,那么您可以为每个数据库运行它以生成脚本
脚本:
SELECT
'CREATE LOGIN [' + SUSER_SNAME(sid) + '] FROM WINDOWS'
FROM
sys.database_principals
WHERE
[type] IN ('G', 'U')
Run Code Online (Sandbox Code Playgroud)
理想情况下,您应该在执行还原之前编写用户和权限的脚本。如果这还没有发生,那么您需要事后着手解决问题,很可能会遗漏某些事情,但您应该能够完成大约 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。
| 归档时间: |
|
| 查看次数: |
28453 次 |
| 最近记录: |