在Microsoft SQL Server中,CREATE DATABASE
和CREATE ANY DATABASE
权限之间有什么区别?
我找不到权威的答案。我所能推断的最好是(a)CREATE ANY
暗示我可以创建该数据库以由另一个用户拥有,而CREATE
(b)在Sybase / SQL Server早期的原始权限是CREATE ANY
并且CREATE
被别名为符合ANSI。
在Microsoft SQL Server中,CREATE DATABASE
和CREATE ANY DATABASE
权限之间有什么区别?
我找不到权威的答案。我所能推断的最好是(a)CREATE ANY
暗示我可以创建该数据库以由另一个用户拥有,而CREATE
(b)在Sybase / SQL Server早期的原始权限是CREATE ANY
并且CREATE
被别名为符合ANSI。
Answers:
我相信我已经找到了权威的答案,这在本文提供的表格中有很大帮助: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存储这些权限的地方。
好吧,这很有趣。