还原数据库SQL Server查询

时间:2013-08-15 20:31:52

标签: sql sql-server

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

2 个答案:

答案 0 :(得分:9)

检查this: -

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

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

GO

步骤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

答案 1 :(得分:2)

  

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

我想:

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

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

    1. 用户必须也存在于第二台服务器上,当您在那里恢复数据库时,它不会自动创建
    2. 仅在第二台服务器上创建一个具有相同名称的新用户是不够的 - 对于SQL Server,这将是另一个用户!
    3. 我想第二点是你的用户在恢复后没有“正确设置”的原因。

      一些背景知识:

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

      所以可能发生的事情是:

      • 在旧服务器上,有一个用户“Mohammed Tahir”,其中包含SID 123456789
      • 在数据库中,有一个权限,说“允许SID 123456789从此数据库中读取”
      • 您在新服务器上恢复了数据库
      • 您在新服务器上创建了一个用户“Mohammed Tahir”,但他有一个不同的SID(假设为987654321),因此123456789上的现有权限不起作用他!

      所以你需要的是一种将用户从旧服务器“复制”到新服务器的方法,具有完全相同的SID。

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

      您可以从此MSDN文章中获取sp_help_revlogin
      How to transfer logins and passwords between instances of SQL Server

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