一尘不染

CREATE DATABASE 与 CREATE ANY DATABASE 权限

sql-server

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

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


阅读 159

收藏
2022-11-16

共1个答案

一尘不染

看起来 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 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 存储这些权限的地方。

2022-11-16