如何在 SQL Server 2012 上创建只读服务器角色?

joh*_*oha 17 permissions sql-server-2012

我在创建新服务器角色时授予“查看任何数据库”权限,但意识到此权限仅允许用户查看系统数据库。

我正在尝试创建一个只读且可以读取任何数据库的服务器角色。

有没有办法创建用户定义的服务器角色来读取用户数据库?或者我是否必须通过每个用户的用户映射来做到这一点?

Aar*_*and 21

发布本作只是因为它是太长了评论,因为它的答案是相关的其他用户很快。

SQL Server 2014 添加了一些新的服务器级权限,这些权限将有助于这种类型的场景——它们在设计时就考虑到了审计,但这种类型的要求似乎也符合该要求。您可以简单地将以下两个权限添加到服务器级登录:

CONNECT ANY DATABASE

SELECT ALL USER SECURABLES
Run Code Online (Sandbox Code Playgroud)

前者,就像听起来一样,允许登录连接到任何数据库。这样做的好处是,即使对于将来创建的数据库,它也允许这样做(前提是您没有设置显式拒绝,这是您可以保护某些用户数据库免受具有此权限的登录的影响)。后者允许登录对他们有权访问的任何数据库执行读取操作 - 因此他们可以SELECT从表、视图、UDF 等中执行读取操作,但他们将无法执行任何UPDATE操作(我还没有测试此权限是否理解何时存储过程执行 DML)。如果您想授予登录对整个服务器的全开放读取访问权限,或者更细粒度,您可以授予CONNECT某些数据库的传统权限,并且唯一的SELECT ALL USER SECURABLES右边会适用于登录名可以显式访问的那些数据库。

2014安全更改记录在这里-好吧,部分; 他们忘记了数据库级别的权限ALTER ANY DATABASE EVENT SESSION——尽管这与这里无关。


Sim*_*rts 8

没有服务器级别的“读取任何数据库”权限,并且无法授予服务器级别的角色数据库级别的权限

所以是的,您必须单独将用户映射到数据库。如果您使用的是 Active Directory,则可以创建一个 windows 组,然后为该组提供 SQL Server 登录名,然后在该组的所有数据库中应用 db_datareader(不过,您需要在每个数据库中创建用户)。