Não é possível excluir o banco de dados do SQL Server via executável de linha de comando

2

Ao executar um executável de linha de comando, uma das tarefas é descartar um banco de dados. Quando isso é executado, o SQL Server informa que 'DBName' does not exist or you do not have permission . O banco de dados está confirmado para existir. Neste ponto do script, ele já foi colocado off-line e configurado no modo de usuário único (para garantir que não haja conexões ativas antes da exclusão). Por que o programa não pode descartar o banco de dados?

EDIT: O usuário que estou executando como é capaz de excluir o banco de dados manualmente via SQL Server Management Studio.

O executável da linha de comando que estou executando é, na verdade, um programa C # compilado que está executando a instrução DROP DATABASE SQL via System.Data.SqlClient.SqlConnection. Ele está se conectando ao SQL Server usando as mesmas credenciais de conexão (localhost com segurança integrada) usadas para conectar-se por meio da GUI.

O SQL real sendo executado (copiado / colado no SQL Server para teste) é:

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

EDIT 2: Este programa funciona no My Machine (tm), mas não no servidor remoto que precisa ser executado.

    
por Scott 24.09.2010 / 19:23

2 respostas

3

O monitor de processo (www.sysinternals.com) informará se há um problema de permissão no nível do arquivo e se o executável da linha de comando está realmente sendo executado sob o usuário que você espera.

Por despeito, tente uma string de conexão sql auth contra o windows auth que você está usando. Isso pode ajudá-lo a restringir os problemas de permissão, se isso for relacionado à permissão.

    
por 24.09.2010 / 20:56
2

Meu palpite é que deixá-lo no modo de usuário único (ou colocá-lo off-line) está fazendo com que System.Data.SqlClient.SQLConnection perca a cabeça.

Isso, e eu suponho que sua conexão está sendo feita ao banco de dados mestre quando você executa esta declaração?

Você também pode tentar algo como o seguinte para matar as conexões manualmente (observe que isso pode causar estragos - mas como você está sobrecarregando o DB de qualquer forma ... eu assumo que essas considerações não importam muito).

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'
    
por 24.09.2010 / 20:52