我无法找到权威的答案.我能推断的最好的是(a)CREATE ANY意味着我可以创建数据库以供另一个用户拥有,而使用CREATE我不能,或者(b)Sybase /早期sql Server时代的原始权限是CREATE ANY和CREATE是ANSI一致性的别名.
解决方法
它们都是权限,但CREATE DATABASE仅查询当前使用的数据库的安全上下文,而CREATE ANY DATABASE可以查找sql Server上的登录列表.这似乎是实现的,因为ANSI sql服务器的一般期望是在某些主系统数据库中赋予权限,并且该数据库中的用户被授予权限.然后,新数据库的默认行为是咨询master以查看它应该继承的权限. (sql 101,我知道,但这里的确如此.)
因此,当您授予CREATE DATABASE时,您实际上必须让master中的用户授予此权限.如果你尝试这个,它可以工作(在master中创建一个用户,授予它创建数据库,然后你可以创建数据库).但是,通过授予创建任何数据库(或授予角色dbcreator),您不需要成为master中的文字用户.
要进一步说明这两个权限之间的区别,请观察通过在主服务器与另一个数据库上授予用户CREATE DATABASE返回的不同消息,然后冲洗并重复以获取CREATE ANY DATABASE权限.
use master; GRANT CREATE DATABASE to TestUser
Msg 15151,Level 16,State 1,Line 1 Cannot find the user ‘TestUser’,
because it does not exist or you do not have permission.
发生此错误的原因是用户TestUser尚未在master数据库中.这是一个数据库级权限 – 它没有上下文可以超出所选数据库并查找登录名或用户.请注意,如果先在master中创建用户,则此命令会成功,您可以创建数据库,就像创建了CREATE ANY DATABASE一样.
use master; GRANT CREATE ANY DATABASE to TestUser
Command(s) completed successfully.
这成功是因为,作为专有的Microsoft sql Server权限,CREATE ANY DATABASE可以查询sql实例的登录列表,而不仅仅是当前使用的数据库中的用户.
use test; GRANT CREATE DATABASE to TestUser
Msg 15151,
because it does not exist or you do not have permission.
这证明了我对第一个例子的解释的一致性.请注意以下查询及其产生的错误消息.如果您首先在此数据库中创建用户,则不会收到此错误消息(请参阅上一个查询).
use test; GRANT CREATE ANY DATABASE to TestUser
Msg 4621,State 10,Line 1 Permissions at the server scope
can only be granted when the current database is master
如第二个查询所示,CREATE ANY DATABASE查询登录列表,我已经创建了此登录名.因此,虽然sql Server承认用户的存在,但它仍然出错,因为我试图在除master之外的某处授予服务器级权限,这在MSsql中是不允许的.
use test; create user TestUser; grant create database to TestUser
CREATE DATABASE permission can only be granted in the master database.
Msg 0,Level 11,State 0,Line 0 A severe error occurred on the
current command. The results,if any,should be discarded.
既然有一个用户申请CREATE DATABASE,我会收到一般错误消息,除了master之外,你不能在任何地方提供服务器级权限,因为那是sql Server存储这些权限的地方.
嗯,这很有趣.