CREATE DATABASE与CREATE ANY BASEBASE权限


21

在Microsoft SQL Server中,CREATE DATABASECREATE ANY DATABASE权限之间有什么区别?

我找不到权威的答案。我所能推断的最好是(a)CREATE ANY暗示我可以创建该数据库以由另一个用户拥有,而CREATE(b)在Sybase / SQL Server早期的原始权限是CREATE ANY并且CREATE被别名为符合ANSI。


回应亚伦所说的+1,但您确实应该剪切所做的编辑,将其粘贴为答案,然后接受。原因有两个:弄清楚答案是什么(您的编辑是一个很好的答案),也更简洁(未回答的问题有时会碰到顶部以引起更多关注)。
Simon Righarts 2012年

1
完成了,但是直到明天我都不能接受,而且昨天我根本无法发布任何答案(<100 rep的自我回答限制为5个小时)。
Tohuw 2012年

Answers:


21

我相信我已经找到了权威的答案,这在本文提供的表格中有很大帮助:http : //msdn.microsoft.com/zh-cn/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

消息15151,级别16,状态1,行1找不到用户“ TestUser”,因为它不存在或您没有权限。

发生此错误是因为用户TestUser尚未在master数据库中。这是数据库级别的权限–它没有上下文可以进入所选数据库之外并查找登录名或用户。请注意,如果您首先在master中创建用户,此命令将成功执行,并且您可以像授予CREATE ANY DATABASE一样创建数据库。

use master; GRANT CREATE ANY DATABASE to TestUser

命令已成功完成。

之所以成功,是因为作为专有Microsoft SQL Server权限,CREATE ANY DATABASE可以查询SQL实例的登录列表,而不仅是当前使用的数据库中的用户。

use test; GRANT CREATE DATABASE to TestUser

消息15151,级别16,状态1,行1找不到用户“ TestUser”,因为它不存在或您没有权限。

这证明了我对第一个示例的解释的一致性。请注意以下查询及其产生的错误消息。如果您首先在此数据库中创建用户,则不会收到此错误消息(请参阅最后一个查询)。

use test; GRANT CREATE ANY DATABASE to TestUser

消息4621,级别16,状态10,第1行仅在当前数据库为master时才能授予服务器范围的权限

如第二个查询中所示,CREATE ANY DATABASE会查询我已经在其中创建此登录名的登录列表。因此,尽管SQL Server确认了用户的存在,但它仍然出错,因为我试图授予除master之外的其他服务器级别的权限,这在MSSQL中是不允许的。

use test; create user TestUser; grant create database to TestUser

CREATE DATABASE权限只能在master数据库中授予。消息0,级别11,状态0,行0当前命令发生严重错误。结果(如果有的话)应丢弃。

既然有一个要应用CREATE DATABASE的用户,我将收到一般错误消息,即您不能在master之外的任何地方授予服务器级权限,因为这是SQL Server存储这些权限的地方。

好吧,这很有趣。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.