我有一系列从db中选择数据的存储过程。我有一个角色(cctc_reader),它具有在程序上授予的执行权限。其中一个过程调用另一个名为recControl_system_option
的存储过程,该过程依次查询Information_schema.columns
。
问题是在这个proc中查询
select column_name from information_schema.columns where table_name = 'recControl_manager'
不会返回任何记录。 cctc_reader具有以下授权权限:
recControl_system_option
如果我将db_datareader授予cctc_reader,那么查询就可以了,但我不想将读者权限授予所有表(因此我使用了存储过程)。我已尝试按照某些文章中的建议在主数据库中授予对Information_schema的选择权限,但仍无法使其生效。
有什么建议吗?
答案 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