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

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

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

编辑:我以该身份运行的用户可以通过 SQL Server Management Studio 手动删除数据库。

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

实际执行的 SQL(复制/粘贴到 SQL Server 进行测试)是:

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

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

答案1

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

为了避免这种情况,请尝试使用 SQL 身份验证连接字符串,而不是您正在使用的 Windows 身份验证。如果与权限有关,这可能会帮助您缩小权限问题的范围。

答案2

我的猜测是,将其置于单用户模式(或使其脱机)会导致 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'

相关内容