CREATE DATABASE 与 CREATE ANY DATABASE 权限

Toh*_*huw 23 sql-server permissions

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

我找不到权威的答案。我能推断出的最好结果是 (a)CREATE ANY暗示我可以创建由另一个用户拥有的数据库,而CREATE我不能,或者 (b) Sybase/早期 SQL Server 时代的原始权限曾经CREATE ANY并且CREATE被别名为ANSI 一致性。

Toh*_*huw 23

我相信我已经找到了权威答案,这篇文章中提供的表格极大地帮助了我: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 中创建一个用户,授予它创建数据库,然后你可以创建数据库)。但是,通过授予 create any database(或授予角色 dbcreator),您无需成为 master 中的文字用户。

为了进一步说明这两种权限之间的差异,请观察通过授予用户 CREATE DATABASE on master 与另一个数据库返回的不同消息,然后冲洗并重复 CREATE ANY DATABASE 权限。

use master; GRANT CREATE DATABASE to TestUser
Run Code Online (Sandbox Code Playgroud)

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

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

use master; GRANT CREATE ANY DATABASE to TestUser
Run Code Online (Sandbox Code Playgroud)

命令成功完成。

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

use test; GRANT CREATE DATABASE to TestUser
Run Code Online (Sandbox Code Playgroud)

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

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

use test; GRANT CREATE ANY DATABASE to TestUser
Run Code Online (Sandbox Code Playgroud)

Msg 4621, Level 16, State 10, Line 1 只有当当前数据库是 master 时才能授予服务器范围的权限

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

use test; create user TestUser; grant create database to TestUser
Run Code Online (Sandbox Code Playgroud)

CREATE DATABASE 权限只能在 master 数据库中授予。Msg 0, Level 11, State 0, Line 0 当前命令发生严重错误。结果,如果有的话,应该被丢弃。

现在有一个 CREATE DATABASE 用户可以申请,我收到了一般错误消息,除了 master 之外,您不能在任何地方授予服务器级权限,因为这是 SQL Server 存储这些权限的地方。

嗯,这很有趣。