7

我想要一种方法来编写我自己的查询来恢复数据库。要恢复的数据库需要具有删除当前用户并重新映射同一用户的所有设置。这样做的原因是当数据库恢复时,用户将没有正确的设置来使用数据库,并且必须重新分配用户权限。

4

2 回答 2

15

看看这个: -

第 1 步:从备份中检索数据库的逻辑文件名。

RESTORE FILELISTONLY
FROM DISK = 'D:BackUpYourBaackUpFile.bak'

第 2 步:在后续步骤中使用 LogicalName 列中的值。----将数据库设为单用户模式

ALTER DATABASE YourDB
SET SINGLE_USER WITH
ROLLBACK IMMEDIATE

----恢复数据库

RESTORE DATABASE YourDB
FROM DISK = 'D:BackUpYourBaackUpFile.bak'
WITH MOVE 'YourMDFLogicalName' TO 'D:DataYourMDFFile.mdf',
MOVE 'YourLDFLogicalName' TO 'D:DataYourLDFFile.ldf'

/如果数据库在多用户模式之前语句没有错误。如果发生错误,请执行以下命令,它将在多用户中转换数据库。/

ALTER DATABASE YourDB SET MULTI_USER
GO
于 2013-08-15T20:41:06.437 回答
2

这样做的原因是当数据库恢复时,用户将没有正确的设置来使用数据库,并且必须重新分配用户权限。

我猜是:

  1. 您正在使用混合模式身份验证,并且用户是 SQL Server 用户(不是 Windows 用户)
  2. 您正在将数据库还原到与进行备份的服务器不同的服务器

正确的?

如果是,您需要考虑以下事项:

  1. 用户也必须存在于第二台服务器上,当您在那里恢复数据库时,它不会自动创建
  2. 仅仅在第二台服务器上创建一个同名的新用户是不够的——对于 SQL Server,这将是一个不同的用户!

我想第二点是您的用户在恢复后没有“正确设置”的原因。

一些背景:

  • 在内部,所有 SQL Server 用户都由一个SID (唯一且不可读的东西 - 类似于GUID。SQL Server 内部不关心实际用户名)表示
  • 每个用户对数据库的权限都保存在数据库中,使用 SID 而不是用户名
  • 当您将数据库恢复到不同的服务器时,权限会随数据库一起恢复......但它们仅在新服务器上有具有确切 SID 的用户时才有效
  • 正如我之前所说:当您创建一个具有相同名称的新用户时,他会获得一个新的 SID。

所以可能发生的事情是这样的:

  • 在旧服务器上,有一个 SID 为“Mohammed Tahir”的用户123456789
  • 在数据库内部,有一个权限显示“123456789允许从该数据库读取 SID”
  • 您在新服务器上恢复了数据库
  • 您在新服务器上创建了一个用户“Mohammed Tahir”,但他有不同的 SID(比方说987654321),因此现有权限对123456789他不起作用!

因此,您需要一种使用完全相同的 SID 将用户从旧服务器“复制”到新服务器的方法。

Microsoft 有一个名为 的存储过程sp_help_revlogin,它就是这样做的。
它使用旧服务器中的所有用户生成一个脚本。然后,您可以在新服务器上运行该脚本,它将创建具有与旧服务器上相同的 SID 的用户。
然后,您可以将数据库从旧服务器恢复到新服务器,并且数据库中已经存在的所有权限都可以正常工作

您可以sp_help_revlogin从这篇 MSDN 文章中获得:
如何在 SQL Server 实例之间传输登录名和密码

请注意,实际的恢复过程并没有什么特别之处——用户和他们的 SID 会有所不同。
因此,您不需要任何“特殊”命令来恢复数据库,只需要标准命令,例如Rahul Tripathi's answer中的命令。

于 2013-08-15T21:08:49.173 回答