2010-08-05 144 views
4

我有一系列从db中选择数据的存储过程。我有一个角色(cctc_reader),具有对这些过程授予的执行权限。其中一个过程调用另一个名为recControl_system_option的存储过程,该过程又查询Information_schema.columnsSQL Server 2008授予information_schema.columns的权限

的问题是,在这个PROC查询

select column_name from information_schema.columns where table_name = 'recControl_manager'

不返回任何记录。 cctc_reader有权限授予上:

  • 每个选择PROC
  • recControl_system_option

所以理论上这应该工作。在dbo下运行时我没有问题。

如果我将db_datareader授予cctc_reader,查询很好,但我不想授予读者对所有表的权限(因此我为什么使用存储的特效)。我已经尝试按照某些文章中的建议授予对主数据库中的Information_schema的选择权限,但仍无法使其工作。

有什么建议吗?

回答

4

对象的元数据的可见性是受VIEW DEFINITION权限:

GRANT VIEW DEFINITION ON ... TO cctc_reader; 

视图定义权限允许用户 上看到它的权限被授予可保护 的元数据。 但是,查看定义权限 不赋予对安全本身的访问。例如,仅在桌面上被授予VIEW DEFINITION 权限的用户 可以看到与 sys.objects目录视图中的表有关的元数据 。但是, 没有其他权限,如 SELECT或CONTROL,用户不能从 读取表中的数据。

授予权限的权利取决于您的方案。它可能是dbo或其他模式,它可能是数据库本身,它可能是单个表。如果我在你的位置,我会代码签署recControl_system_option过程,并且我会授予在服务器级别签名上的VIEW ANY DEFINITION,这是一种更好和更安全的方式,即使用角色和授予角色权限。有关如何签署过程并向签名授予服务器级权限的示例,请参见Signing an activated procedure

+0

太棒了!感谢您的意见。我已经研究出如何解决这个问题,并且给了我很多想法......。 – pilsdumps 2010-08-05 16:04:50

2

Remus提到,元数据可见性会影响查询系统表和视图时返回的数据。如果您对安全(对象,登录,无论什么)没有权限,它将不可见。

根据您的情况,您将允许内部调用已经EXECUTE AS OWNER,或在UDF,作为EXECUTE AS OWNER

我们使用这种技术,我们的元数据查询包裹INFORMATION_SCHEMA.COLUMNS。