恢复数据库SQL server查询

恢复数据库SQL server查询,sql,sql-server,Sql,Sql Server,我想要一种方法来编写自己的查询来恢复数据库。要还原的数据库需要具有删除当前用户并重新映射同一用户的所有设置。原因是当数据库恢复时,用户将没有使用数据库的正确设置,必须重新分配用户权限。签出:- 步骤1:从备份中检索数据库的逻辑文件名 RESTORE FILELISTONLY FROM DISK = 'D:BackUpYourBaackUpFile.bak' 去 步骤2:在以下步骤中使用LogicalName列中的值。 ----将数据库设置为单用户模式 ALTER DATABASE YourDB

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

签出:-

步骤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'
/若语句中并没有错误,则数据库将处于多用户状态 模式 如果发生错误,请执行以下命令,它将转换 多用户数据库/

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

我想:

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

    如果是,你需要考虑以下内容:

  • 用户也必须存在于第二台服务器上,在那里还原数据库时不会自动创建该用户
  • 仅仅在第二台服务器上创建一个同名的新用户是不够的-到SQL server,这将是一个不同的用户
  • 我想第二点是用户在恢复后没有“正确设置”的原因

    一些背景:

    • 在内部,所有SQL Server用户都由一个SID表示(某种唯一且不可读的东西-类似于。SQL Server在内部不关心实际用户名)
    • 每个用户对数据库的权限保存在数据库中,使用SID而不是用户名
    • 将数据库还原到其他服务器时,权限将随数据库一起还原…但只有当新服务器上有具有确切SID的用户时,权限才起作用
    • 正如我之前所说:当你创建一个同名的新用户时,他会得到一个新的SID
    所以可能发生的情况是:

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

    因此,您需要的是一种使用完全相同的SID将用户从旧服务器“复制”到新服务器的方法。 Microsoft中有一个名为
    sp\u help\u revlogin
    的存储过程,它就是这样做的。
    它使用旧服务器上的所有用户生成一个脚本。然后,您可以在新服务器上运行脚本,它将使用旧服务器上的相同SID创建用户。
    然后,您可以将数据库从旧服务器恢复到新服务器,并且数据库中已有的所有权限都可以正常工作

    您可以从这篇MSDN文章中获得
    sp\u help\u revlogin

    请注意,实际的恢复过程并没有什么特别之处-是用户及其SID造成了不同。

    因此,您不需要任何“特殊”命令来恢复数据库,只需要标准命令,例如来自的命令。

    通常这称为备份。此功能仅在SQL2012Hello中可用。我只是想知道,如果我想通过从“.bak”文件还原来覆盖当前正在使用的数据库,该怎么办?谢谢
    ALTER DATABASE YourDB SET MULTI_USER
    GO