Назад | Перейти на главную страницу

Невозможно удалить базу данных SQL Server через исполняемый файл из командной строки

При запуске исполняемого файла командной строки одна из задач - удалить базу данных. Когда это запускается, SQL Server сообщает мне, что 'DBName' does not exist or you do not have permission. Подтверждено существование базы данных. На этом этапе скрипта он уже переведен в автономный режим и переведен в однопользовательский режим (чтобы убедиться, что перед удалением нет активных подключений). Почему программа не может сбросить базу данных?

РЕДАКТИРОВАТЬ: пользователь, с которым я работаю, может удалить базу данных вручную через SQL Server Management Studio.

Исполняемый файл командной строки, который я запускаю, на самом деле является скомпилированной программой C #, которая выполняет DROP DATABASE Оператор SQL через System.Data.SqlClient.SqlConnection. Он подключается к SQL Server с использованием тех же учетных данных (localhost со встроенной безопасностью), которые использовались для подключения через графический интерфейс.

Фактическое выполнение SQL (копирование / вставка в SQL Server для тестирования):

IF EXISTS (SELECT name FROM sys.databases WHERE name = N'DBName') DROP DATABASE DBName

РЕДАКТИРОВАТЬ 2: эта программа работает на моей машине (tm), но не на удаленном сервере, на котором ее нужно запустить.

Монитор процессов (www.sysinternals.com) сообщит вам, есть ли проблема с разрешениями на уровне файла и действительно ли исполняемый файл командной строки работает под пользователем, которого вы ожидаете.

Несмотря на это, попробуйте строку подключения sql auth по сравнению с Windows auth, которую вы используете. Это может помочь вам сузить проблемы с разрешениями, если это связано с разрешениями.

Я предполагаю, что перевод его в однопользовательский режим (или перевод в автономный режим) приводит к тому, что System.Data.SqlClient.SQLConnection теряет рассудок.

Это, и я предполагаю, что ваше соединение устанавливается с основной базой данных, когда вы выполняете этот оператор?

Вы также можете попробовать что-то вроде следующего, чтобы убить соединения вручную (обратите внимание, это может / вызовет хаос - но, поскольку вы все равно уничтожаете БД ... Я полагаю, что эти условия не имеют большого значения).

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 killer

FETCH 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
END

CLOSE killer
DEALLOCATE killer
GO

WAITFOR DELAY '00:00:00.500'