sql-server – CREATE DATABASE与CREATE ANY DATABASE权限

前端之家收集整理的这篇文章主要介绍了sql-server – CREATE DATABASE与CREATE ANY DATABASE权限前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在Microsoft sql Server中,CREATE DATABASE和CREATE ANY DATABASE权限之间有什么区别?

我无法找到权威的答案.我能推断的最好的是(a)CREATE ANY意味着我可以创建数据库以供另一个用户拥有,而使用CREATE我不能,或者(b)Sybase /早期sql Server时代的原始权限是CREATE ANY和CREATE是ANSI一致性的别名.

解决方法

我相信我找到了权威的答案,在本文提供的表格中有很大帮助: http://msdn.microsoft.com/en-us/library/ms178569.aspx.看起来CREATE DATABASE确实是ANSI sql兼容权限,而CREATE ANY DATABASE是MSsql专有服务器权限.但是,两者并不相同.事实上,两者之间有一个相当重要的区别,我通过尝试发现了这一点.

它们都是权限,但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存储这些权限的地方.

嗯,这很有趣.

猜你在找的MsSQL相关文章