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)