2012-10-31 8 views
7

Jestem obecnie próbuje upuść bazę danych za pomocą następującego koduNiezawodnie upuść bazę danych na SQL Server 2008 za pośrednictwem C#

using Microsoft.SqlServer.Management.Smo; 

var server = new Server(Server); 
server.KillAllProcesses("Db"); 
server.KillDatabase("Db"); 

Czasem to działa, ale inni otrzymuję następujący wyjątek:

Microsoft.SqlServer.Management.Smo.FailedOperationException: Zabrakło bazy danych Kill dla serwera "Host1".
---> Microsoft.SqlServer.Management.Common.ExecutionFailureException: Wystąpił wyjątek podczas wykonywania instrukcji lub wsadu Transact-SQL.
---> System.Data.SqlClient.SqlException: Nie można teraz wprowadzić zmian stanu lub opcji bazy danych "Db". Baza danych jest w trybie pojedynczego użytkownika, a użytkownik jest z nią połączony.

Jakieś pomysły, w jaki sposób rzetelnie upuścić bazę danych za pomocą kodu?

+0

Próbowałeś ' ALTER DATABASE Db SET MULTI_USER; 'first? –

+5

Osobiście nie używałbym do tego SMO, głównie dlatego, że nie wiem dokładnie, co robią funkcje 'Kill ...()'. Powiedziałbym raczej 'USE master; ZMIENIAJ BAZY DAB USTAWIĆ SINGLE_USER WITH ROLLBACK IMMEDIATE; DROP DATABASE Db; ' –

+0

Baza danych nie jest domyślnie ustawiona jako SingleUser, myślę, że nieudana próba w metodzie KillDatabase polega na przekształceniu go w pojedynczego użytkownika, a następnie pozostawieniu go w ten sposób. – Konstantinos

Odpowiedz

3

Aby niezawodnie usunąć bazę danych za pośrednictwem SMO wystarczy wywołać server.KillDatabase("Db");. MSDN stwierdza, że ​​KillDatabase zrzuca aktywne połączenia, nawet jeśli ich przykłady są nieco mylące.

KillDatabase numery ALTER DATABASE [Db] SET SINGLE_USER WITH ROLLBACK IMMEDIATE, a następnie DROP DATABASE. KillAllProcesses wyświetla listę wszystkich połączeń i powoduje jedno zabicie na proces jako oddzielną partię; zakładając, że KillAllProcesses jest asynchroniczny, wyjątek jest generowany, gdy następuje zabicie po KillDatabase ustawia DB w trybie pojedynczego użytkownika.

1

W moim przypadku błąd, który otrzymywałem został naprawiony przez dodanie server.Databases.Refresh przed metodą KILL. Powodem jest to, że baza danych, którą próbowałem upuścić, została utworzona po utworzeniu obiektu serwera, innymi słowy tworzyłem bazę danych tymczasowo, wyodrębniając z niej dane i upuszczając je. Baza danych nie pojawiła się na liście baz danych (obiektu). Dodanie odświeżania rozwiązało problem ...

0

Naprawiłem taki błąd przez utworzenie połączenia ServerConnection bez łączenia. Tak:

var serverConnection = new ServerConnection(serverName) 
{ 
    ..., 
    NonPooledConnection = true 
}; 
server = new Server(serverConnection); 
server.KillAllProcesses(databaseName); 
1

Mam błędu ("drop udało ...") Korzystanie z MSDN:

dbServer.KillAllProcesses(db.Name); 
dbServer.KillDatabase(db.Name); 

Prace wokół było:

string sqlCommandText = @"USE master; 
ALTER DATABASE [" + db.Name + "] SET SINGLE_USER WITH ROLLBACK IMMEDIATE; 
DROP DATABASE [" + db.Name + "]"; 
dbServer.ConnectionContext.ExecuteNonQuery(sqlCommandText); 
Powiązane problemy