我们的开发团队创建了一些 SSRS 报告,这些报告仅从每个数据库中检索元数据(不是“真实”数据)。我正在尝试将运行这些报告的服务帐户锁定为所需的最低权限。
查询仅从每个数据库中的系统表中进行选择,例如:
sys.tables
sys.extended_properties
SYS.objects
SYS.schemas
sys.dm_db_partition_stats
sys.indexes
我认为以下会做到这一点,但没有这样的运气。
GRANT VIEW ANY DATABASE TO [DOMAIN\LOGIN]
GRANT VIEW SERVER STATE TO [DOMAIN\LOGIN]
GRANT VIEW DATABASE STATE TO [DOMAIN\LOGIN]
查询系统表会报错:
The server principal "DOMAIN\LOGIN" is not able to access the database "DATABASENAME" under the current security context.
除了为每个数据库创建一个登录用户然后明确授予对系统表的权限外,我似乎找不到解决此问题的方法。这对所有未来的数据库提出了一系列新的挑战。我是否遗漏了什么,或者没有简单的方法可以在不授予“sysadmin”服务器级角色的情况下全面授予对所有数据库的访问权限?
从 SQL Server 2014 开始,
CONNECT ANY DATABASE
可以使用新权限来完成此操作您无需授予对系统表的权限,它们对任何用户都是可见的。但是它们包含的对象的可见性取决于用户拥有的权限:他只能看到它拥有权限的那些对象:元数据可见性配置
这可以通过授予您的登录
VIEW ANY DEFINITION
权限来解决此外,无需授予
VIEW ANY DATABASE TO
权限,因为它已授予公共,并且VIEW SERVER STATE TO
您描述检索的元数据不需要。因此,您只需要这些权限:
CONNECT ANY DATABASE
访问所有数据库VIEW DATABASE STATE
用于查询sys.dm_db_partition_stats
VIEW ANY DEFINITION
拥有任何元数据的权利您可以在 master 数据库和
GRANT VIEW ANY DEFINITION TO <USERNAME>
. 这将为所有数据库中的指定用户启用元数据可见性。