阿里云RDS for SQL Server的账号管理有不少小Bug,而且有一个很严重的Bug:任何普通账号,都能创建数据库。注意,我这里是说任意普通账号,任意任意普通账号!任意任意普通账号!重要的事情说三遍。
例如,下面测试环境所示,RDS for SQL Server的数据库版本为SQL Server 2016 WEB,我们在控制平台的“账号管理”界面,创建一个数据库账号test2,如下所示,只授予“只读”权限。
、
我们使用脚本get_login_rights_script.sql 获取数据库账号test2的具体权限如下所示:

使用test2账号登录数据库,执行下面脚本就能创建一数据库,如下所示。根据个人的测试,这个账号可以为任意普通账号。即使取消服务器角色setupamin与processadmin,依然是可以创建数据库的。
- CREATE DATABASE [MyDB]
- CONTAINMENT = NONE
- ON PRIMARY
- ( NAME = N'MyDB', FILENAME = N'E:\SQLDATA\DATA\MyDB.mdf' , SIZE = 5120KB , FILEGROWTH = 10%)
- LOG ON
- ( NAME = N'MyDB_log', FILENAME = N'E:\SQLDATA\DATA\MyDB_log.ldf' , SIZE = 1024KB , FILEGROWTH = 10%)
- GO
如果可以创建数据库,当然也可以删除数据库,当然,只能删除它自己创建的数据库,不能删除其它数据库。
DROP DATABASE MyDB;
删除不是这个账号创建的数据库时就会报错。如下所示:
- DROP DATABASE test4;
-
- Msg 3701, Level 11, State 2, Line 15
- Cannot drop the database 'test4', because it does not exist or you do not have permission.
是否很神奇?传统数据库需要有服务器角色dbcreator(当然,sysadmin角色肯定也可以) 或者授予CREATE ANY DATABASE、 CREATE DATABASE, ALTER ANY DATABASE其中一个权限才能创建数据库。但是RDS for SQL Server的普通账号没有授予这些权限,却依然可以创建数据库。实在是想不明白它为什么有这样一个Bug。 RDS for SQL Server的高权限账号有权限限制,所以很多事情也无法更深入的去探究。目前,我们也提交、报告了这个问题,暂时还没有得到官方回复!