不能通过命令行可执行文件删除SQL Server数据库

运行命令行可执行文件时,其中一个任务是删除数据库。 当这个运行时,SQL Server告诉我'DBName' does not exist or you do not have permission 。 数据库被确认存在。 此时,脚本已经脱机并设置为单用户模式(确保在删除之前没有活动连接)。 程序如何不能删除数据库?

编辑:我正在运行的用户能够通过SQL Server Management Studio手动删除数据库。

我正在运行的命令行可执行文件实际上是一个编译的C#程序,它通过System.Data.SqlClient.SqlConnection执行DROP DATABASE SQL语句。 它使用与用于通过GUI连接的相同连接凭证(具有集成安全性的本地主机)连接到SQL Server。

正在执行的SQL(复制/粘贴到SQL Server中进行testing)是:

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

编辑2:此程序在我的计算机(tm)上工作,但不需要在远程服务器上运行。

进程监视器(www.sysinternals.com)会让你知道是否存在文件级权限问题,以及命令行可执行文件是否真正在你期望的用户下运行。

尽pipe如此,尝试一个SQL身份validation连接string与您正在使用的Windows身份validation。 这可能会帮助您缩小权限问题,如果这是权限相关。

我的猜测是,将其放入单用户模式(或使其脱机)正在导致System.Data.SqlClient.SQLConnection失去理智。

那么,我假设你执行这个语句时你正在连接到master数据库?

你也可以尝试类似下面的方法来手动终止连接(注意,这可能会造成严重的破坏 – 但是由于你无论如何都要对数据库进行encryption……我认为这些限制并不重要)。

 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'