有没有一种方法可以授予用户仅对数据库的所有非系统视图的访问权限?


9

在SQL Server中,我在一个特定的数据库中有一个用户,并且被要求授予他们访问数据库的所有非系统视图的权限。我相信可以通过编辑类型视图的安全对象并在每个视图上授予选择权限来实现,但是视图很多。有没有更有效的方法来实现这一目标?

Answers:


8

没有语法如

GRANT SELECT ON ALL::Views TO SomeUser 

您可以GRANT SELECT对单个对象模式或整个数据库具有权限,但不能按对象类型过滤,仅包括视图。对于这种临时任务,我可能会创建一个名为的新角色ViewReader,将用户添加到该角色中,然后在SSMS中运行

SELECT 'GRANT SELECT ON ' + 
          QUOTENAME(SCHEMA_NAME(schema_id)) + '.' + QUOTENAME(name) + 
      ' TO ViewReader;'
FROM sys.views
WHERE is_ms_shipped = 0

生成脚本以运行到GRANT所需的权限。


非常感谢您的优美回答。该脚本有点烦人,因此在尝试实现之前我会做一些阅读。再次感谢。
克里斯托弗·加西亚

1
@lush-该脚本仅向您提供一些命令以供查看,复制,粘贴和运行。您可以做一些更复杂的事情来连接结果,EXEC但是我不会为一次性任务打扰。
马丁·史密斯

我现在明白了,这是解决这个问题的完美解决方案,谢谢!
克里斯托弗·加西亚

4

对于我的情况,我采取了另一种方法。这是我所做的:

  1. 创建一个登录并将其映射到数据库。
  2. 例如,转到数据库以创建名为Public_View的架构。此架构的所有者必须与视图将引用的表的所有者相同。
  3. 向新用户授予对新架构的访问权限。
  4. 在新架构中根据需要创建任意数量的视图,新用户将可以访问它们。

好消息是,新用户将无法访问表,他甚至无法看到表。

希望对您有所帮助。


4
+1对我而言,关于此解决方案的好处是,在创建新视图时无需显式分配权限。
马丁·史密斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.