db_owner incapaz de descartar banco de dados - Erro 615, SQL Server

11

Eu tenho um banco de dados do SQL Server 2012 em execução no Amazon EC2. Eu criei um usuário para poder criar, editar e descartar bancos de dados. Eu dei o novo usuário com dbcreatorfunção de servidor.

Meu usuário pode se conectar remotamente e executa com êxito o create database foo;comando. Mas quando o usuário tenta soltar o banco de dados novamente com drop database foo;o comando falha com o seguinte erro:

Warning: Fatal error 615 occurred at Feb  1 2014  5:15PM.
   Note the error and time, and contact your system administrator.
ErrorCode: 21

Mesmo que o banco de dados selecionado esteja master(então eu não acho que seja porque está em uso). E o comando é bem-sucedido quando eu o executo novamente, conectado como usuário administrativo.

Eu verifiquei o banco de dados recém-criado, e meu usuário recebeu a db_ownerfunção no banco de dados como eu esperava, então meu entendimento é que isso deve ter permissões suficientes para que esse usuário possa eliminar o banco de dados que acabou de criar.

insira a descrição da imagem aqui

De acordo com http://technet.microsoft.com/en-us/library/ms178613.aspx, a função db_owner deve ter permissões suficientes. "Requer a permissão CONTROL no banco de dados, a permissão ALTER ANY DATABASE ou a associação à função de banco de dados fixa db_owner."

Eu procurei o erro 615 e encontrei "Não foi possível encontrar a ID da tabela do banco de dados% d, nome '%. * Ls'." o que não faz sentido para mim. http://technet.microsoft.com/en-us/library/aa937592(v=sql.80).aspx

Informação da versão do servidor sql: Microsoft SQL Server 2012 (SP1) - 11.0.3368.0 (X64) /n May 22 2013 17:10:44 /n Copyright (c) Microsoft Corporation/n Express Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: ) (Hypervisor)/n- de select @@version.

Tim Abell
fonte

Respostas:

12

Suponho que você tenha a opção AutoClose para o banco de dados definida como True. Esse é o comportamento padrão quando você cria um banco de dados com o Express Editions.

O erro mencionado pode ocorrer exatamente neste caso. Na verdade, a mensagem de erro completa 615 declara: "Could not find database ID %d, name '%.*ls'. The database may be offline. Wait a few minutes and try again."... Portanto, aponta que o banco de dados pode ser fechado durante o descarte.

Portanto, acesse as propriedades do banco de dados, alterne para False e tente novamente soltá-lo ou use o script abaixo antes de soltar

ALTER DATABASE [MyDB] SET AUTO_CLOSE OFF 
GO

Muitos apontam que é melhor ter o AutoClose definido como False. Encontrei este artigo explicando um pouco mais sobre o AutoClose: http://sqlmag.com/blog/worst-practice-allowing-autoclose-sql-server-databases

Pequena extensão da resposta:

-- this works in standard SQL Server Editions, but NOT with Express Editions:
CREATE DATABASE [MyDB]
GO
DROP DATABASE [MyDB]
GO

-- this works in ALL SQL Server Editions
CREATE DATABASE [MyDB]
GO
ALTER DATABASE [MyDB] SET AUTO_CLOSE OFF 
GO
DROP DATABASE [MyDB]
GO
Aprendiz
fonte
2

A configuração que você descreve deve estar bem.

Existe alguma chance de você realmente tentar eliminar o banco de dados como um usuário diferente?

Eu recomendo conectar como usuário de teste usando SSMS para ter 100% de certeza de que você é esse usuário. Além disso, antes de interromper a verificação do banco de dados, você pode acessar alguns dados, talvez também possa testá-lo no modo de usuário único, o que eu acho que você precisará fazer de qualquer maneira

Joel Mansford
fonte
De fato, tentei o SSMS diretamente no servidor, estabelecendo uma nova conexão com as credenciais desse usuário. Mesmo resultado que remotamente. Acabei de verificar e o usuário pode realmente criar uma tabela, inserir uma linha e ler a linha com êxito. Verifiquei duas vezes se o usuário correto estava sendo exibido antes de executar a consulta em ssms e estava, mas depois de executar a instrução drop, ela mudou para "não conectado". Eu acho que é só porque é um erro fatal, mas eu não tinha notado isso antes agora.
Tim Abell 02/02
2
@ Tim: Sim, erros de nível 20 e superior eliminam a conexão, então isso é apenas um sintoma. O log de erros do SQL Server ou o log de eventos do aplicativo fornece mais informações?
Jon Seigel
Receio não ter tido a chance de voltar a verificar isso, mas obrigado pela dica. Vou verificar os logs da próxima vez que estiver analisando isso (não tenho certeza de quando será).
Tim Abell
0

Não encontrei a causa disso, mas a seguinte solução, embora não seja a melhor, habilita o comando.

É minha esperança que aponte para o problema e alguém possa fornecer uma resposta melhor.

Eu uso o Microsoft SQL Server Management Studio (Administrador) Em logins de segurança do host local

Clique duas vezes em usuário, selecione Funções do Servidor, forneça dbcreator, public e sysadm.

DarrylBassett
fonte