Sql server SQL Server 2008授予信息\u schema.columns的权限

Sql server SQL Server 2008授予信息\u schema.columns的权限,sql-server,sql-server-2008,permissions,information-schema,Sql Server,Sql Server 2008,Permissions,Information Schema,我有一系列从数据库中选择数据的存储过程。我有一个角色(cctc_reader),该角色具有对过程授予的执行权限。其中一个过程调用另一个名为recControl\u system\u option的存储过程,该存储过程依次查询Information\u schema.columns 问题是在这个过程中,查询 从information\u schema.columns中选择column\u name,其中table\u name='recControl\u manager' 不返回任何记录。cctc

我有一系列从数据库中选择数据的存储过程。我有一个角色(cctc_reader),该角色具有对过程授予的执行权限。其中一个过程调用另一个名为
recControl\u system\u option
的存储过程,该存储过程依次查询
Information\u schema.columns

问题是在这个过程中,查询

从information\u schema.columns中选择column\u name,其中table\u name='recControl\u manager'

不返回任何记录。cctc_读卡器已授予以下权限:

  • 每个选择过程
  • recControl\u system\u选项
所以从理论上讲,这应该是可行的。我在dbo下运行时没有问题

如果我将db_datareader授予cctc_reader,查询就可以了,但我不想将reader权限授予所有表(因此我使用了存储过程)。我曾尝试按照某些文章中的建议,在masterdb中授予对Information_schema的Select权限,但仍然无法实现


有什么建议吗?

对象元数据可见性取决于以下权限:

GRANT VIEW DEFINITION ON ... TO cctc_reader;
视图定义权限允许 用户可以查看安全数据库的元数据 在其上授予许可。 但是,查看定义权限 不授予访问的权限 自我保护。例如,用户 它只被授予视图定义 表上的权限可以查看元数据 与中的表相关 sys.objects目录视图。然而, 没有其他权限,例如 选择或控制,用户无法 从表中读取数据


授予权限的正确安全性取决于您的场景。它可以是dbo或其他模式,也可以是数据库本身,也可以是单个表。如果我在你的位置上,我会对recControl\u system\u选项过程进行代码签名,并在服务器级别授予对签名的任何定义,这是一种更好、更安全的使用角色和授予角色权限的方式。有关如何对过程进行签名并对签名授予服务器级权限的示例,请参见。

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

根据您的情况,您将允许内部调用以所有者身份执行,或将信息_schema.columns包装在udf中,作为
所有者执行


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

如果在其他地方发现了这种情况,请创建一个存储过程,调用数据库中的系统存储过程sp_列。您的存储过程可以使用与其他存储过程相同的权限执行。缺点是返回的集合中有许多您可能不感兴趣的列。我敢说你可以改进这场狂欢。我选择在代码中选择字段

CREATE PROCEDURE [dbo].[proc_tblMyTableSchemaGet] 
作为 开始


结束

太好了!谢谢你的意见。我已经想出了解决这个问题的办法,而你给了我很多思考的食物。。。。!
SET NOCOUNT ON;


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