SQL Server 2008向information_schema.columns授予权限

时间:2010-08-05 15:32:22

标签: sql-server sql-server-2008 permissions information-schema

我有一系列从db中选择数据的存储过程。我有一个角色(cctc_reader),它具有在程序上授予的执行权限。其中一个过程调用另一个名为recControl_system_option的存储过程,该过程依次查询Information_schema.columns

问题是在这个proc中查询

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

不会返回任何记录。 cctc_reader具有以下授权权限:

  • 每个select proc
  • recControl_system_option
理论上这应该有效。在dbo下运行时我没有问题。

如果我将db_datareader授予cctc_reader,那么查询就可以了,但我不想将读者权限授予所有表(因此我使用了存储过程)。我已尝试按照某些文章中的建议在主数据库中授予对Information_schema的选择权限,但仍无法使其生效。

有什么建议吗?

3 个答案:

答案 0 :(得分:6)

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

的约束
GRANT VIEW DEFINITION ON ... TO cctc_reader;
  

VIEW DEFINITION权限允许a   用户查看安全的元数据   获得许可的人。   但是,查看DEFINITION权限   不授予访问权限   安全本身。例如,用户   只授予VIEW DEFINITION   表上的权限可以查看元数据   与表中的相关   sys.objects目录视图。然而,   没有额外的权限,如   SELECT或CONTROL,用户不能   从表中读取数据。

授予权限的权利取决于您的方案。它可以是dbo或其他一些模式,它可以是数据库本身,也可以是单独的表。如果我在你的位置,我会对recControl_system_option程序进行代码签名,并且我会在服务器级别的签名上授予VIEW任意定义,这是一种使用角色和授予角色权限的更好,更安全的方式。有关如何签署过程并为签名授予服务器级别权限的示例,请参阅Signing an activated procedure

答案 1 :(得分:2)

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

根据您的具体情况,您可以允许内部调用具有EXECUTE AS OWNER,或将Information_schema.columns包装在udf中EXECUTE AS OWNER

我们在查询元数据时使用这种技术。

答案 2 :(得分:0)

在其他地方找到它,创建一个在您的数据库中调用System sproc sp_columns的sproc。您的存储过程可以执行与其他存储过程相同的权限。缺点是返回的集合中有许多您可能不感兴趣的列。我敢说您可以优化该存储过程。我选择在代码中进行字段选择。

CREATE PROCEDURE [dbo].[proc_tblMyTableSchemaGet] 

AS 开始

SET NOCOUNT ON;


exec sp_columns @table_name = 'myTable', @table_owner = 'dbo';

END