Hik*_*ari 1 security sql-server permissions sql-server-2012 master-system-database
我注意到我可以在master数据库中创建表、模式、存储过程等。
我不知道是什么授予此权限。这很烦人,因为当我们在 SSMS 中打开一个 *.sql 文件时,它默认与master 相关。如果在CREATE没有注意到并设置正确的数据库上下文的情况下执行操作,则在master 中创建表。
如果我们没有权限,我们会得到一个错误,注意到它并更改数据库上下文。有了权限,表就创建好了,后面我们才看到错误,需要删除重新创建。我注意到在master中已经错误地创建了一些表。
我想撤销每个人类用户的许可,但我害怕破坏某些东西。我不知道某些 SQL Server 例程是否需要在那里创建的权限。
在不破坏 SQL Server 的情况下从master撤销创建权限的最佳方法是什么?
您需要确定登录名如何访问在 master 中运行 DDL。以下查询将返回具有服务器级角色成员身份的登录列表:
SELECT ServerName = @@SERVERNAME
, RoleName = roles.name
, MemberName = members.name
, IsEnabled = CASE WHEN members.is_disabled = 1 THEN 0 ELSE 1 END
FROM sys.server_role_members srm
INNER JOIN sys.server_principals roles ON srm.role_principal_id = roles.principal_id
INNER JOIN sys.server_principals members on srm.member_principal_id = members.principal_id
WHERE members.name NOT LIKE 'NT %' --exclude builtin principals
ORDER BY roles.name
, members.name;
Run Code Online (Sandbox Code Playgroud)
您可以使用xp_logininfo来了解特定 Windows 帐户如何访问 SQL Server:
EXEC xp_logininfo @acctname = 'DOMAIN\Username', @option = 'all';
Run Code Online (Sandbox Code Playgroud)
如果相关人员具有该sysadmin角色的成员资格,您将无法阻止他们在master(或其他任何地方)运行 DDL 语句。
假设这些人不是sysadmin服务器角色的成员,那么DENY权限优先于已经拥有的权限GRANTed。
您可以创建一个名为“NoMasterDDL”的 Windows 安全组并将您的开发人员添加到该组。为该组创建一个登录名,然后DENY为您不希望人们在 master 中执行的 DDL 语句授予权限。
USE master;
CREATE LOGIN [DOMAIN\NoMasterDDL] FROM WINDOWS;
CREATE USER [DOMAIN\NoMasterDDL] FOR LOGIN [DOMAIN\NoMasterDDL];
DENY ALTER ON DATABASE::master TO [DOMAIN\NoMasterDDL];
Run Code Online (Sandbox Code Playgroud)
以上将阻止[DOMAIN\NoMasterDDL]组成员执行任何 DDL 类型的语句,例如CREATE TABLE.
如果用户当前是sysadmin的成员,则任何DENY权限都无效。特别是在开发环境中,开发人员可能有这样的访问权限。如果是,则CONTROL SERVER可以使用该权限;它与sysadmin相同,但服从DENY权限。
因此,您可以授予CONTROL SERVER而不是让他们成为sysadmin服务器角色的成员,然后使用DENY ALTER如上所示防止master数据库中的DDL 。