8

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

问题是在这个过程中查询

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

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

  • 每个选择过程
  • recControl_system_option

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

如果我将 db_datareader 授予 cctc_reader 查询很好,但我不想授予所有表的读取器权限(因此我使用存储过程)。我已尝试按照某些文章中的建议授予对 Master 数据库中 Information_schema 的 Select 权限,但仍然无法使其正常工作。

有什么建议么?

4

3 回答 3

6

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

GRANT VIEW DEFINITION ON ... TO cctc_reader;

VIEW DEFINITION 权限允许用户查看授予权限的安全对象的元数据。但是,VIEW DEFINITION 权限并不授予对安全对象本身的访问权限。例如,仅被授予对表的 VIEW DEFINITION 权限的用户可以在 sys.objects 目录视图中查看与表相关的元数据。但是,如果没有 SELECT 或 CONTROL 等附加权限,用户将无法从表中读取数据。

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

于 2010-08-05T15:44:00.113 回答
2

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

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

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

于 2010-08-05T16:04:34.143 回答
0

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

CREATE PROCEDURE [dbo].[proc_tblMyTableSchemaGet] 

开始

SET NOCOUNT ON;


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

结尾

于 2018-06-22T04:14:25.297 回答