我注意到我可以在主数据库中创建表、模式、存储过程等。
我不知道是什么授予了这个权限。这很烦人,因为当我们在 SSMS 中打开 *.sql 文件时,它默认与master相关。如果在CREATE
没有注意到并设置正确的数据库上下文的情况下执行操作,则在master中创建表。
如果我们没有权限,我们会得到一个错误,注意到它并更改数据库上下文。有了权限,表就被创建了,我们稍后才看到错误,需要删除它并重新创建。我注意到master中已经有一些错误创建的表。
我想撤销每个人类用户的许可,但我害怕破坏某些东西。我不知道某些 SQL Server 例程是否需要在那里创建的权限。
在不破坏 SQL Server的情况下撤销master的创建权限的最佳方法是什么?
您需要确定登录名如何有权在 master 中运行 DDL。以下查询将返回具有服务器级角色成员身份的登录列表:
您可以使用
xp_logininfo
以下命令了解特定 Windows 帐户如何访问 SQL Server:如果相关人员具有该
sysadmin
角色的成员资格,您将无法阻止他们在master
(或其他任何地方)运行 DDL 语句。假设这些人不是
sysadmin
服务器角色的成员,那么DENY
权限优先于已经拥有的权限GRANTed
。您可以创建一个名为“NoMasterDDL”的 Windows 安全组,并将您的开发人员添加到该组。为组创建登录名,然后
DENY
对您不希望人们在 master 中执行的 DDL 语句的权限。以上将阻止
[DOMAIN\NoMasterDDL]
组成员执行任何 DDL 类型的语句,例如CREATE TABLE
.正如我在回答您之前的问题时所说的,AMtwo在评论中提到:
如果用户当前是sysadmin的成员,则任何
DENY
权限都将无效。特别是在开发环境中,开发人员可能具有这样的访问权限。如果是这样,CONTROL SERVER
可以使用权限代替;它与sysadmin相同,但服从DENY
权限。因此,您可以授予
CONTROL SERVER
而不是使它们成为sysadmin服务器角色的成员,然后DENY ALTER
如上所示使用以防止主数据库中的 DDL。