Porównaj ceny domen i usług IT, sprzedawców z całego świata

Nie można usunąć bazy danych SQL Server za pomocą pliku wykonywalnego z wiersza poleceń


Po uruchomieniu pliku wykonywalnego wiersza poleceń jednym z zadań jest usunięcie bazy danych. Kiedy to się zaczyna, SQL Server mi to mówi
       'DBName' does not exist or you do not have permission
... Istnienie bazy danych zostało potwierdzone. W tym momencie w skrypcie został już przeniesiony do trybu offline i przeniesiony do trybu pojedynczego użytkownika (aby upewnić się, że nie ma aktywnych połączeń przed usunięciem). Dlaczego program nie może zrzucić bazy danych?
EDYCJA: Użytkownik, z którym pracuję, może ręcznie usunąć bazę danych za pośrednictwem programu SQL Server Management Studio.
Plik wykonywalny wiersza polecenia, który używam, jest w rzeczywistości skompilowanym programem C #, który to robi
       DROP DATABASE
Instrukcja SQL za pośrednictwem System.Data.SqlClient.SqlConnection. Łączy się z SQL Server przy użyciu tych samych poświadczeń (localhost z wbudowanymi zabezpieczeniami), których używał do łączenia się przez GUI.
Rzeczywiste wykonanie SQL (skopiuj/wklej do SQL Server w celu przetestowania):
IF EXISTS (SELECT name FROM sys.databases WHERE name = N'DBName') DROP DATABASE DBName

EDYCJA 2: Ten program działa na moim komputerze (tm), ale nie na zdalnym serwerze, na którym ma być uruchomiony.
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Process Monitor (www.sysinternals.com) poinformuje Cię, czy występuje problem z uprawnieniami na poziomie pliku i czy plik wykonywalny wiersza poleceń faktycznie działa pod oczekiwanym użytkownikiem.
Niezależnie od tego wypróbuj parametry połączenia uwierzytelniania sql zamiast uwierzytelniania systemu Windows, którego używasz. Może to pomóc w zawężeniu problemów z uprawnieniami, jeśli są one związane z uprawnieniami.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Domyślam się, że ustawienie go w trybie pojedynczego użytkownika (lub przełączenie go w tryb offline) powoduje szaleństwo System.Data.SqlClient.SQLConnection.
To i zakładam, że połączenie jest ustanawiane z główną bazą danych podczas wykonywania tej instrukcji?
Możesz także spróbować czegoś podobnego do poniższego, aby ręcznie zabić połączenia (pamiętaj, że może to spowodować spustoszenie - ale ponieważ i tak zabijasz bazę danych ... przypuszczam, że te warunki nie mają większego znaczenia).
USE master
GO
DECLARE killer CURSOR LOCAL FAST_FORWARD FOR
SELECT
spid
FROM
dbo.sysprocesses
WHERE
dbid = DB_ID('dbname here') DECLARE @spid int
DECLARE @sql nvarchar(20)OPEN killerFETCH NEXT FROM killer INTO @spid
WHILE @@FETCH_STATUS = 0 BEGIN SET @sql = N'KILL ' + CAST(@spid as nvarchar(5)) EXEC sp_executesql @sql FETCH NEXT FROM killer INTO @spid
ENDCLOSE killer
DEALLOCATE killer
GOWAITFOR DELAY '00:00:00.500'

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się