我想在生产 SQL Server 上向 Developers 组授予以下权限:
VIEW SERVER STATE
VIEW DEFINITION (server level)
这样做是为了让他们能够查询一些动态管理视图和函数,查看性能数据,以及查看所有存储过程和函数的代码(定义)
是否有任何缺点或任何原因在某些情况下不好?
授予上述权限的任何可能的不良副作用?
第二个问题 - 如果我VIEW DEFINITION
在 master 数据库中授予,这使得它成为服务器级别并且不必在任何用户数据库中授予?与SHOWPLAN
?
对于
VIEW DEFINITION
/VIEW ANY DEFINITION
你可能没问题,因为开发人员可能已经可以访问源代码。因为
VIEW SERVER STATE
,这确实控制了对广泛功能的访问,因此您在授予此权限时需要更加谨慎和谨慎。主要考虑因素是:访问需要多大程度的开放性和限制性?问题是没有粒度VIEW SERVER STATE
:要么全部要么没有。开发人员是否需要完全的临时查询访问权限,或者他们只是需要能够执行您将提供的一些预定义查询的能力?如果他们需要完全的临时查询访问权限,那么您可能需要授予他们
VIEW SERVER STATE
。但是,如果您可以提供有限数量的查询,那么您不需要授予他们任何东西(除了EXECUTE
包含正在提供的查询的存储过程的权限之外)。在这种情况下,您将授予存储过程VIEW SERVER STATE
权限(和/或ALTER TRACE
允许)。开发人员只能通过存储过程使用这些提升的权限。而且,如果任何开发人员试图偷偷摸摸地更新其中一个存储过程以以另一种方式使用提升的权限,那么任何更新的存储过程都会自动失去提升的权限。这一切都可以通过Module Signing来实现。例如,请参阅我对创建数据库的存储过程的执行权限的回答(也在 DBA.StackExchange 上)。
一旦你有了这个安全机制(即证书和基于证书的登录名和/或用户,取决于你需要授予的权限范围),它就可以应用于任意数量的存储过程、触发器、TVF (内联除外)和 UDF。如果需要第二个权限,那么如果始终需要该权限以及初始权限,只需将其添加到相同的基于证书的主体(登录和/或用户)。如果仅在某些情况下需要第二个权限,则从第二个证书创建另一个证书和另一个基于证书的主体,将另一个权限分配给第二个基于证书的主体,然后执行
ADD SIGNATURE
再次,在需要其他权限的对象上使用第二个证书(您可以向对象添加多个签名,从而组合权限)。VIEW DEFINITION
是数据库权限。VIEW ANY DEFINITION
您可以添加相应的服务器权限。如果您想授予某些登录访问权限以查看服务器状态和任何所有对象元数据,您可以这样做:您可以
SHOWPLAN
为每个数据库授予权限,也可以ALTER TRACE
在服务器级别授予权限。ALTER TRACE
还允许用户创建您可能不希望开发人员在生产服务器上执行的 SQL 跟踪。这都记录在Permissions下。Dan Guzman 的链接中的一些注释:
查看服务器状态