db_owner no puede eliminar la base de datos - Error 615, SQL Server


11

Tengo una base de datos SQL Server 2012 que se ejecuta en Amazon EC2. He creado un usuario para poder crear, editar y soltar bases de datos. Le di al nuevo usuario con dbcreatorfunción de servidor.

Mi usuario puede conectarse de forma remota y ejecuta con éxito el create database foo;comando. Pero cuando el usuario intenta soltar la base de datos nuevamente con drop database foo;el comando falla con el siguiente error:

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

Aunque la base de datos seleccionada es master(así que no creo que sea porque está en uso). Y el comando tiene éxito cuando lo ejecuto nuevamente conectado como usuario administrativo.

Verifiqué la base de datos recién creada, y a mi usuario se le asignó el db_ownerrol en la base de datos como esperaba, así que entiendo que esto debería ser permisos suficientes para que ese usuario pueda eliminar la base de datos que acaba de crear.

ingrese la descripción de la imagen aquí

De acuerdo con http://technet.microsoft.com/en-us/library/ms178613.aspx, el rol db_owner debería tener permisos suficientes. "Requiere el permiso CONTROL en la base de datos, o ALTERAR CUALQUIER permiso de BASE DE DATOS, o pertenecer a la función fija de base de datos db_owner".

Busqué el error 615 y encontré "No se pudo encontrar el ID de tabla de base de datos% d, nombre '%. * Ls'". lo cual no tiene sentido para mí. http://technet.microsoft.com/en-us/library/aa937592(v=sql.80).aspx

Información de la versión del 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- desde select @@version.

Respuestas:


12

Supongo que tiene la opción AutoClose para la base de datos establecida en True. Este es el comportamiento predeterminado cuando crea una base de datos con Express Editions.

El error mencionado puede ocurrir exactamente en este caso. En realidad, el mensaje de error completo 615 dice: "Could not find database ID %d, name '%.*ls'. The database may be offline. Wait a few minutes and try again."... Entonces señala que la base de datos podría cerrarse durante la caída.

Por lo tanto, vaya a las propiedades de la base de datos, cámbielo a Falso e intente soltarlo nuevamente o use el siguiente script antes de soltarlo

ALTER DATABASE [MyDB] SET AUTO_CLOSE OFF 
GO

Muchos señalan que es mejor tener AutoClose configurado en False. Encontré este artículo explicando un poco más sobre AutoClose: http://sqlmag.com/blog/worst-practice-allowing-autoclose-sql-server-databases

Pequeña extensión de la respuesta:

-- 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

2

La configuración que describas debería estar bien.

¿Hay alguna posibilidad de que realmente esté intentando abandonar la base de datos como un usuario diferente?

Recomiendo conectarse como usuario de prueba usando SSMS para estar 100% seguro de que usted es ese usuario. Además, antes de descartar la verificación de la base de datos, puede acceder a algunos datos de ella, tal vez también probar que puede ponerla en modo de usuario único, lo que supongo que tendrá que hacer de todos modos.


De hecho, he intentado con SSMS directamente en el servidor, estableciendo una nueva conexión con las credenciales de este usuario. Mismo resultado que remotamente. Acabo de comprobar y el usuario puede crear una tabla, insertar una fila y volver a leer la fila con éxito. Verifiqué dos veces que se mostraba el usuario correcto antes de ejecutar la consulta en ssms y así fue, pero después de ejecutar la instrucción drop cambió a "no conectado". Supongo que es solo porque es un error fatal, pero no me había dado cuenta antes.
Tim Abell

2
@Tim: Sí, los errores de nivel 20 y superiores cortan la conexión, así que eso es solo un síntoma. ¿El registro de errores de SQL Server o el registro de eventos de la aplicación dan más información?
Jon Seigel

Me temo que no he tenido la oportunidad de volver a revisar esto, pero gracias por el consejo. Revisaré los registros la próxima vez que esté investigando esto (no estoy seguro de cuándo será).
Tim Abell

0

No encontré la causa de esto, pero la siguiente, aunque no es la mejor solución, habilita el comando.

Espero que señale el problema y que alguien pueda brindar una mejor respuesta.

Yo uso Microsoft SQL Server Management Studio (Administrador) bajo los inicios de sesión de seguridad de localhost

Haga doble clic en usuario, seleccione Roles de servidor, proporcione dbcreator, public y sysadm.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.