1
votes

Le code VB.Net pour sauvegarder et enregistrer la base de données SQL Server ne fonctionnera pas

J'utilise le code suivant pour sauvegarder une base de données SQL Server à l'aide de VB.Net vers un autre emplacement physique. Mais j'obtiens l'erreur suivante en essayant de l'enregistrer dans les PC clients. Dans certains clients, cela fonctionne sur les disques durs externes mais pas sur tous les clients.

Impossible d'ouvrir le périphérique de sauvegarde 'D: \ 11-16-2020_POS_DB_MM.bak'. Erreur du système d'exploitation 5 (l'accès est refusé.)
BACKUP DATABASE se termine anormalement.

Je comprends que c'est une erreur qui se produit en raison des autorisations des utilisateurs. Est-il possible de rectifier cela dans mon code ou dois-je toujours définir des autorisations utilisateur dans chaque client (la base de données est dans un serveur et il y a plusieurs clients. J'utilise un package d'installation pour déployer sur les clients)

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


10 commentaires

L'erreur semble vous indiquer le problème; le compte de service sous lequel SQL Server s'exécute n'a pas accès à la destination vers laquelle vous souhaitez effectuer la sauvegarde. Ce n'est pas quelque chose que vous pouvez corriger dans votre code VB, c'est quelque chose qui doit être fait du côté de vos administrateurs réseau. N'oubliez pas non plus que tous les chemins sont du point de vue des instances , pas des utilisateurs. D:\ se rapporterait au périphérique monté sur D pour l'utilisateur sous lequel SQL Server s'exécute sur l'instance sur laquelle il s'exécute; qui est probablement un deuxième périphérique de stockage local. S'il s'agit d'un réseau, vous devez utiliser un chemin UNC.


Je gère également le serveur de base de données. Comment puis-je le corriger du côté du serveur de base de données ou du réseau?


Demandez à votre administrateur réseau de vous assurer que le compte de service sous lequel l'instance SQL s'exécute pour pouvoir accéder au périphérique de stockage local D sur l'hôte sur lequel l'instance s'exécute.


Je suis le seul informaticien ici et je dois gérer le réseau même si je ne suis pas très doué pour cela. Je souhaite choisir la destination à sauvegarder à l'aide d'une boîte de dialogue de fichier. Mais selon vos instructions, ce n'est pas possible. N'est-ce pas?


Cela dépend de votre objectif. Je ne sais toujours pas, par exemple, si D: est local pour l'instance ou pour l'utilisateur. Si l'utilisateur, certainement pas en tant que compte de service de l'instance SQL, ne devrait pas avoir autant d'accès sur le domaine. Vous devez normalement sauvegarder puis copier la sauvegarde vers un emplacement local si vous en avez besoin localement; ou placez-le sur un emplacement réseau et RESTORE localement à partir du chemin réseau.


D est dans l'utilisateur et il changera en fonction de l'emplacement sélectionné par l'utilisateur via la boîte de dialogue de fichier


Alors voir mon commentaire précédent .


Ce que j'essaie de réaliser ici, c'est de permettre aux utilisateurs des clients de faire des sauvegardes sur leur propre ordinateur. Le serveur leur est physiquement inaccessible


Cela a une forte odeur de problème XY si je suis honnête. Les utilisateurs qui n'ont pas accès au serveur ne doivent pas en créer de sauvegarde. L'application, d'ailleurs, est dangereusement ouverte à l'injection; surtout lorsque vous utilisez la LOGIN sa pour l'application.


Le problème est que je ne suis pas présent sur le site des clients et que leurs connaissances informatiques sont très faibles. Le serveur y est physiquement protégé car il gère une application financière sensible. Les clients n'ont pas la possibilité de restaurer la base de données ou ils ne connaissent pas le chemin du serveur depuis son intégration dans l'application. L'application a un formulaire avec un bouton de commande de sauvegarde qu'ils utilisent pour revenir au lecteur externe. Ceci est très utile dans mon cas car cela garantit plus d'options de sauvegarde. En tout cas merci beaucoup pour les conseils. Je vais uniquement sur le site pour restaurer les sauvegardes en cas d'échec.


3 Réponses :


1
votes

Veuillez ajouter l'autorisation Contrôle total pour l'utilisateur d'authentification Windows dans la propriété de fichier. https://docs.microsoft.com/en-us/answers/questions/105605/unable-to-open-the-physical-file-operating-system.html


5 commentaires

dans le serveur ou le client de base de données?


D: \ 11-16-2020_POS_DB_MM.bak votre lecteur D


Cet emplacement n'est pas fixe car l'utilisateur sélectionnera la destination à l'aide d'une boîte de dialogue de fichier. (Ex: l'utilisateur branche une clé USB et sauvegarde la base de données dessus) Je me demandais si c'était possible ou non puisque la destination est dynamique.


stackoverflow.com/questions/18286765/...


Remercier. j'essaierai



1
votes

Plutôt que de sacrifier la sécurité en modifiant les autorisations de répertoire / fichier, vous pouvez créer votre propre sous-répertoire dans le répertoire renvoyé par Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData) , définissez l'ACL pour ce sous-répertoire afin que tous les utilisateurs aient l'autorisation de lecture et d'écriture, créez la sauvegarde dans ce sous-répertoire, puis déplacez le fichier résultant vers l'emplacement sélectionné par l'utilisateur. Le déplacement du fichier se fera dans le contexte de l'utilisateur utilisant votre programme.

Vous pouvez également profiter de l'occasion pour faire la sauvegarde dans une archive zip protégée par mot de passe.


1 commentaires

Merci. Je vais essayer de te faire savoir



1
votes

La base de données est dans un serveur et il y a plusieurs clients. J'utilise un package d'installation pour déployer sur les clients

BACKUP s'exécute toujours sur le serveur et tous les lecteurs doivent être montés sur le serveur, pas sur le client. Vous ne pouvez pas simplement brancher une clé USB sur un client et y sauvegarder une base de données sur le serveur.

Notez également que sous Windows, seuls les administrateurs peuvent écrire des fichiers à la racine d'un lecteur. Si vous souhaitez placer la sauvegarde sur le lecteur D :, vous devez créer un dossier pour celui-ci et lui accorder des autorisations.

Une base de données sur un serveur doit avoir une sauvegarde automatisée configurée, mais si vous souhaitez lancer une sauvegarde ad-hoc et que vous n'avez pas accès au serveur, vous pouvez sauvegarder la base de données sur un compte de stockage Blob Azure à l'aide de la sauvegarde vers l'URL .


2 commentaires

Merci pour les précieux conseils.


J'ai remarqué chez certains clients que cette fonction de sauvegarde fonctionne (mais pas sur tous les clients) lors de l'enregistrement sur des clés USB externes (pas sur le hdd du PC). Aucune configuration particulière n'a été effectuée sur ce PC. Comment cela se passe-t-il?