在LAN系统上生成备份和还原SQL数据库

Bha*_*rat 2 c# sql-server winforms

我正在创建一个Windows桌面应用程序,但我陷入了需要SO开发人员指导的地步.

我的要求:

我的主要要求是创建一个可以将一个系统的数据库复制到另一个系统的Windows窗体应用程序.

见下面的图片.

在此输入图像描述

我到底尝试了什么?

我成功创建了备份文件并使用C#在本地系统中恢复它,但现在它只适用于本地系统(系统A).

我面临的问题是什么?

我想用C#实现这一点.我可以使用共享文件夹处理所有这些,但不建议这样做.

  1. 如何访问在另一个LAN系统中生成的备份,因为我们永远无法访问其他系统的目录.我想我可以用共享文件夹来做,但是有没有其他方法可以复制备份文件并将其存储在运行我的应用程序的系统中.

  2. 如何将备份文件还原到另一个LAN系统.据我所知,SQL没有权限从外部本地目录恢复数据库.

有没有其他方法来实现这种(复制数据库)功能?

任何与流程或任何参考相关的帮助将不胜感激.

Emi*_*eni 5

您可以将DB的备份创建到远程位置.例如,系统B将在System C的共享文件夹中创建备份.然后,您可以在System C上还原备份.您也可以反过来这样做,在系统B上创建共享文件夹,在此文件夹中创建备份并从远程位置恢复System C上的备份.

考虑到你想要完成的事情的性质,我假设如下:

  1. 系统A上运行应用程序的用户帐户具有足够的权限来访问系统B系统C中的两个SQL Server实例.
  2. 如果遵循建议,则使用Windows身份验证模式创建SQL Server登录.如果是这种情况,则系统A中的应用程序使用运行应用程序的用户帐户向两台服务器进行身份验证.
  3. 应在System C上创建共享文件夹.为了举例,我们可以说D:\TEST\是共享的\\SYSTEM C\TEST\.
  4. 应该为在系统A上运行应用程序的用户帐户授予足够的权限,以便从System C访问和写入共享文件夹

如果可以满足所有先前条件,则可以从系统A中的应用程序中对系统B执行以下命令:

BACKUP DATABASE [MyDataBase] TO  DISK = N'\\SYSTEM C\TEST\MyDataBase.bak' WITH NOFORMAT, INIT,  NAME = N'MyDataBase-Full Database Backup', SKIP, NOREWIND, NOUNLOAD,  STATS = 10
Run Code Online (Sandbox Code Playgroud)

假设\\SYSTEM C\TEST\D:\TEST\(在System C中,显然是)远程地址,那么,从系统A中的应用程序,您可以在System C上执行以下命令:

RESTORE DATABASE [MyDataBaseCopy] FROM  DISK = N'D:\TEST\MyDataBase.bak' WITH  FILE = 1,  NOUNLOAD,  REPLACE,  STATS = 5
Run Code Online (Sandbox Code Playgroud)

这两个命令都可以从SqlCommand实例中解析出来,一个与System B 连接,另一个与System C连接.

希望能帮助到你.

编辑1

感谢@ PMF的评论,指出可能存在这样的情况,即该解决方案不起作用.如果你遇到这种错误:

Msg 3201, Level 16, State 1, Line 1
Cannot open backup device '\\SYSTEM C\TEST\MyDataBase.bak. Operating system error 5(Access is denied.).
Run Code Online (Sandbox Code Playgroud)

您可以根据您的方案尝试以下选项之一:

  1. 如果您的网络位于Windows域下,并且系统B中的SQL Server服务帐户 是托管服务帐户或域帐户,则可以将System C中的共享文件夹的写入权限授予SQL Server的服务帐户.这被认为是最佳做法.
  2. 如果您的网络是在Windows域和SQL Server的服务帐户下的 系统B不是一个托管服务帐户或域帐户,那么你可以设置SQL Server的服务帐户是其中之一,并继续选项1.这被认为是最好的实践.
  3. 在任何其他情况下,如果您不介意将文件夹共享给每个人,那么这样做授予写访问权限.在这种情况下,无论SQL Server运行何种帐户,您都不会遇到此解决方案的问题.这不是最佳做法.