db_owner 无法删除数据库 - 错误 615,SQL Server

Tim*_*ell 12 sql-server permissions sql-server-2012 amazon-ec2

我有一个在亚马逊 EC2 上运行的 SQL Server 2012 数据库。我创建了一个能够创建、编辑和删除数据库的用户。我为新用户提供了dbcreator服务器角色。

我的用户可以远程连接并成功运行create database foo;命令。但是当用户尝试再次使用drop database foo;该命令删除数据库时失败并出现以下错误:

Warning: Fatal error 615 occurred at Feb  1 2014  5:15PM.
   Note the error and time, and contact your system administrator.
ErrorCode: 21
Run Code Online (Sandbox Code Playgroud)

即使选定的数据库是master(所以我认为不是因为它正在使用中)。当我以管理用户身份再次登录时,该命令会成功。

我检查了新创建的数据库,并且我的用户已db_owner按照我的预期在数据库中分配了角色,所以我的理解是,这应该是该用户能够删除他们刚刚创建的数据库的足够权限。

在此处输入图片说明

根据http://technet.microsoft.com/en-us/library/ms178613.aspx,db_owner角色应该有足够的权限。“需要对数据库的 CONTROL 权限,或 ALTER ANY DATABASE 权限,或 db_owner 固定数据库角色的成员身份。”

我查找了错误 615 并发现“找不到数据库表 ID %d,名称为 '%.*ls'。” 这对我来说毫无意义。http://technet.microsoft.com/en-us/library/aa937592(v=sql.80).aspx

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- 来自select @@version.

Lea*_*ner 13

我猜您将数据库的 AutoClose 选项设置为 True。这是使用 Express Edition 创建数据库时的默认行为。

在这种情况下可能会发生上述错误。实际上,完整的错误消息 615 指出:"Could not find database ID %d, name '%.*ls'. The database may be offline. Wait a few minutes and try again."...因此它指出数据库可能会在删除期间关闭。

因此,转到数据库属性,将其切换为 False 并再次尝试删除它或在删除之前使用下面的脚本

ALTER DATABASE [MyDB] SET AUTO_CLOSE OFF 
GO
Run Code Online (Sandbox Code Playgroud)

许多人指出将 AutoClose 设置为 False 更好。我发现这篇文章解释了更多关于 AutoClose 的内容:http : //sqlmag.com/blog/worst-practice-allowing-autoclose-sql-server-databases

答案的小扩展:

-- 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
Run Code Online (Sandbox Code Playgroud)