我有一个具有应用程序角色的数据库.角色成员都属于Active Directory中的组.我没有赋予角色权限以从表中选择,而是赋予角色对其需要调用的所有存储过程的执行权限.
这工作正常,除了我的一个存储过程,它正在构建一些动态SQL并调用sp_executesql.
动态sql看起来像这样:
SET @SQL = N'
SELECT *
FROM dbo.uvView1
INNER JOIN uvView2 ON uvView1.Id = uvView2.Id'
EXEC sp_executesql @SQL
Run Code Online (Sandbox Code Playgroud)
此角色的用户无法调用存储过程.它给出了以下错误,我想这是一种预期:
对象'uvView1',数据库'Foobar',架构'dbo'上的SELECT权限被拒绝.
有没有办法让我的用户成功执行此proc而不赋予动态SQL中所有视图的角色权限?
使用SQL Server 2008,有没有办法只允许通过存储过程插入表,如果是这样,怎么办?
编辑:
最好的方法可能是马丁史密斯建议使用INSTEAD OF INSERT触发器.这个问题的直接答案是marc_s'与GRANT和DENY合作,但它不会限制某些用户帐户.
我有一个数据库,所有访问都由存储过程控制.DBA希望避免为用户提供对基础表的直接读/写访问权限,这是我能理解的.因此,所有数据的更新和选择都是通过存储过程完成的.基本上,他创建了一个角色,该角色对数据库中的所有存储过程具有EXECUTE权限,并为用户提供该角色.
问题是其中一个存储过程动态构建一个SQl查询并通过"Execute sp_Executesql"执行它.在不详细说明的情况下,查询是动态构建的,因为它会根据许多用户输入参数而显着变化.有问题的存储过程只是一个SELECT sql语句,但我发现只是给存储过程EXECUTE权限是不够的.存储过程中引用的使用"执行sp_Executesql"的基础表需要被赋予"datareader"访问权限,否则存储过程将失败.
有关如何纠正此问题的任何想法?我真的想将对表的访问限制为仅存储过程,但我需要找到一种方法来解决使用"Execute sp_Executesq"l的存储过程.谢谢.