Benutzer mit den meisten Antworten
Datenbank per Transact-SQL aus dem SQL Server löschen bzw entfernen, die keine physikalischen Dateien mehr hat

Frage
-
Wenn eine Datenbank im SQL Server 2008 R2 Express geführt wird, deren physikalische Dateien im Dateisystem händisch gelöscht wurden, so habe ich keinen Befehl gefunden, um per Transact-SQL die Datenbank zu löschen, da er immer Exceptions bringt, die Datenbank könnte nicht bearbeitet werden, da die Dateien fehlen.
Mit dem Management Studio geht das, beim Löschen per Menü oder per Befehl gibt es zwar jeweils einen Fehler, wenn ich aber dann den Objekt-Explorer aktualisiere, hat er den Eintrag der entsprechenden Datenbank entfernt. Aus einem .Net-Programm gehts aber nicht weiter, da kann ich so oft löschen, wie ich will. Gibts da eine Möglichkeit ? Muss man irgendwie den SQL Server anweisen, solche Leichen-Einträge zu entfernen ?
Hintergrund: Manchmal gehen Endanwender etwas stürmisch bei der "Deinstallation" unserer Software vor und entfernen die Datenbankdateien händisch, wieso auch immer. Der SQL Server bleibt aber erhalten. Installieren Sie unsere Software neu, so wird angeboten, den vorhandenen SQL Server zu verwenden. Nur können die Datenbanken dann wie oben beschrieben nicht gelöscht und durch die neuen ersetzt werden, wie bereits erwähnt.
Antworten
-
Hi,
kann es sein, dass du die mit der falschen Datenbank verbindest?
Das Management Studio führt folgenden Befehl beim löschen einer Datenbank aus:
EXEC msdb.dbo.sp_delete_database_backuphistory @database_name = N'Test' GO USE [master] GO /****** Object: Database [Test] Script Date: 09.05.2012 12:53:09 ******/ DROP DATABASE [Test] GO
Dies sollte also ebenfalls in einem .NET Programm funktionieren, sofern das Programm mit der master Datenbank verbunden ist.
Grüße
Oliver
- Als Antwort vorgeschlagen Olaf HelperMVP Mittwoch, 9. Mai 2012 11:05
- Als Antwort markiert Ysaeti Donnerstag, 10. Mai 2012 23:23
-
Mit dem Management Studio geht das, beim Löschen per Menü oder per Befehl gibt es zwar jeweils einen Fehler, wenn ich aber dann den Objekt-Explorer aktualisiere, hat er den Eintrag der entsprechenden Datenbank entfernt. Aus einem .Net-Programm gehts aber nicht weiter, da kann ich so oft löschen, wie ich will. Gibts da eine Möglichkeit ? Muss man irgendwie den SQL Server anweisen, solche Leichen-Einträge zu entfernen ?
welchen Befehl / Statements benutzt Du in Deinem .NET Program um die DB zu loeschen ?
Dir ist bekannt, dass Du alle Operationen im Management Studio die Du via GUI ausfuehrst, ebenfalls als Script generieren lassen kannst und dann diesen Script ausfuehren kannst ?
Spiel das einfach mal mit einer DB aus deren Databasefiles geloescht sind, indem Du Delete im Context Menu auswaehlst und dann im Dialog "Delete Object" auf Script klickst (Script Action to new Query Window) und diesen anschaust und ausfuehrst.
Please use Mark as Answer if my post solved your problem and use Vote As Helpful if a post was useful.
- Als Antwort markiert Ysaeti Donnerstag, 10. Mai 2012 23:23
Alle Antworten
-
Hi,
kann es sein, dass du die mit der falschen Datenbank verbindest?
Das Management Studio führt folgenden Befehl beim löschen einer Datenbank aus:
EXEC msdb.dbo.sp_delete_database_backuphistory @database_name = N'Test' GO USE [master] GO /****** Object: Database [Test] Script Date: 09.05.2012 12:53:09 ******/ DROP DATABASE [Test] GO
Dies sollte also ebenfalls in einem .NET Programm funktionieren, sofern das Programm mit der master Datenbank verbunden ist.
Grüße
Oliver
- Als Antwort vorgeschlagen Olaf HelperMVP Mittwoch, 9. Mai 2012 11:05
- Als Antwort markiert Ysaeti Donnerstag, 10. Mai 2012 23:23
-
Mit dem Management Studio geht das, beim Löschen per Menü oder per Befehl gibt es zwar jeweils einen Fehler, wenn ich aber dann den Objekt-Explorer aktualisiere, hat er den Eintrag der entsprechenden Datenbank entfernt. Aus einem .Net-Programm gehts aber nicht weiter, da kann ich so oft löschen, wie ich will. Gibts da eine Möglichkeit ? Muss man irgendwie den SQL Server anweisen, solche Leichen-Einträge zu entfernen ?
welchen Befehl / Statements benutzt Du in Deinem .NET Program um die DB zu loeschen ?
Dir ist bekannt, dass Du alle Operationen im Management Studio die Du via GUI ausfuehrst, ebenfalls als Script generieren lassen kannst und dann diesen Script ausfuehren kannst ?
Spiel das einfach mal mit einer DB aus deren Databasefiles geloescht sind, indem Du Delete im Context Menu auswaehlst und dann im Dialog "Delete Object" auf Script klickst (Script Action to new Query Window) und diesen anschaust und ausfuehrst.
Please use Mark as Answer if my post solved your problem and use Vote As Helpful if a post was useful.
- Als Antwort markiert Ysaeti Donnerstag, 10. Mai 2012 23:23
-
Die etwas umfangreichere und von mir nicht im Detail eingesehene Methode unseres Codes für Datenbankzugriffe war an dieser Stelle nicht so gut geeignet. Die Verwendung des vom Management Studio generierten Skripts mit den richtigen .NET-Befehlen hat zum Erfolg geführt:
Dim con As New Microsoft.SqlServer.Management.Common.ServerConnection con.ApplicationName = My.Application.Info.AssemblyName con.ServerInstance = SQLServerName con.LoginSecure = False con.Login = Username con.Password = Passwort srv = New Server(con) srv.ConnectionContext.Connect() tmpSql = "EXEC msdb.dbo.sp_delete_database_backuphistory @database_name = N'" & datenbank & "'" & vbCrLf & _ "GO" & vbCrLf & _ "USE master" & vbCrLf & _ "GO" & vbCrLf & _ "DROP DATABASE [" & datenbank & "]" & vbCrLf & _ "GO" srv.ConnectionContext.Connect() srv.ConnectionContext.ExecuteNonQuery(tmpSql) srv.ConnectionContext.Disconnect()