При запуске исполняемого файла командной строки одна из задач - удалить базу данных. Когда это запускается, 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'