【问题标题】:VB.Net code to Backup and Save SQL Server database won't work用于备份和保存 SQL Server 数据库的 VB.Net 代码不起作用
【发布时间】:2020-11-16 10:59:07
【问题描述】:

我正在使用以下代码将使用 VB.Net 的 SQL Server 数据库备份到其他物理位置。但是在尝试将其保存在客户端 PC 中时出现以下错误。在某些客户端中,它适用于外部硬盘驱动器,但并非适用于所有客户端。

无法打开备份设备“D:\11-16-2020_POS_DB_MM.bak”。操作系统错误 5(访问被拒绝。)
BACKUP DATABASE 异常终止。

我了解这是由于用户权限而发生的错误。是否可以在我的代码中纠正这个问题,或者我是否总是必须在每个客户端中设置用户权限(数据库在服务器中并且有多个客户端。我使用安装包部署在客户端上)

Public Class frmBackup
    Private connString As String = "Data Source=SQLSERVER\SLMA;Database=master;User Id=sa;Password =" & dbPwd & ";"
    Private con As SqlConnection = New SqlConnection(connString)

Private Sub cmbbackup_Click(sender As Object, e As EventArgs) Handles cmbbackup.Click
        Try
            SaveFileDialog1.FileName = DateAndTime.DateString + "_" + dbName
            SaveFileDialog1.Filter = "SQL Server database backup files|*.bak"
            SaveFileDialog1.ShowDialog()
            Dim cmd As New SqlCommand("BACKUP DATABASE " & dbName & " To disk='" & SaveFileDialog1.FileName & "'", conn)
            If Not conn.State = ConnectionState.Open Then
                conn.Open()
            End If
            cmd.ExecuteNonQuery()
            conn.Close()
            MsgBox("The database was successfully backup to - " & System.IO.Path.GetFullPath(OpenFileDialog1.FileName))
        Catch ex As Exception
            MsgBox(Err.Description)
            Me.Close()
        End Try
    End Sub
    
End Class

【问题讨论】:

  • 错误似乎在告诉你问题所在;运行 SQL Server 的服务帐户无权访问您要备份到的目标。这不是您可以在您的 VB 代码中修复的东西,它需要从您的网络管理员端完成。同样不要忘记,任何路径都是从 instances 的角度出发的,而不是用户的。 D:\ 将与安装在D 上的设备有关,该用户在运行 SQL Server 的实例上运行 SQL Server;这可能是第二个本地存储设备。如果是网络,您应该使用 UNC 路径。
  • 请您的网络管理员确保运行 SQL 实例的服务帐户有权访问运行实例的主机上的本地存储设备 D
  • 取决于您的目标。例如,我仍然不知道D: 是实例本地还是用户本地。如果是用户,当然不是作为 SQL 实例的 Service Account 不应该对域有那么多的访问权限。如果您在本地需要,您通常会备份然后将备份复制到本地位置;或将其放在网络位置并从网络路径本地RESTORE
  • 那就看我的prior comment
  • 老实说,这有一种 XY Problem 的强烈气味。无权访问服务器的用户不应为其创建备份。顺便说一句,该应用程序很容易被注入;特别是当您为应用程序使用sa LOGIN 时。

标签: sql-server database vb.net


【解决方案1】:

数据库在服务器中,并且有多个客户端。我使用安装包部署在客户端上

BACKUP 始终在服务器上运行,并且任何驱动器都必须安装在服务器上,而不是客户端上。您不能只在客户端上插入拇指驱动器,然后将服务器上的数据库备份到它。

另请注意,在 Windows 中,只有管理员可以将文件写入驱动器的根目录。如果您确实想将备份放在 D: 驱动器上,您应该为其创建一个文件夹并授予其权限。

服务器上的数据库应配置自动备份,但如果要启动临时备份并且无权访问服务器,则可以使用 Backup to URL 将数据库备份到 Azure Blob 存储帐户.

【讨论】:

  • 感谢您的宝贵意见。
  • 我注意到在某些客户端中,当保存到外部拇指驱动器(不是在 PC 硬盘上)时,此备份功能正在工作(但不是在所有客户端上)。在那台 PC 上没有进行任何特殊配置。这是怎么回事?
【解决方案2】:

请在文件属性中为 windows 身份验证用户添加完全控制权限。 https://docs.microsoft.com/en-us/answers/questions/105605/unable-to-open-the-physical-file-operating-system.html

【讨论】:

  • 在数据库服务器还是客户端?
  • D:\11-16-2020_POS_DB_MM.bak 你的 D 盘
  • 此位置不固定,因为用户将使用文件对话框选择目标。 (例如:用户插入 USB 驱动器并将数据库备份到其中)我想知道这是否可能,因为目标是动态的。
【解决方案3】:

您可以在Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData)set the ACL返回的目录中为该子目录创建自己的子目录,而不是通过更改目录/文件权限来牺牲安全性,以便所有用户都具有读写权限,在该目录中创建备份子目录,然后将生成的文件移动到用户选择的位置。文件移动将在用户使用您的程序的上下文中完成。

您也可以借此机会将备份制作成受密码保护的 zip 存档。

【讨论】:

  • 谢谢。我会尽力让你知道
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多