我对SQL Server 2008中的User-Defined Table Types有疑问。
为了需要一个ASP.NET应用程序,我们在SQL Server 2008上定义了自己的表类型,以便将它们用作存储过程中的参数(在ASP.NET应用程序中执行sql命令时,我们将DataTable对象作为参数传递对于存储过程see here for an example)
问题是当我们从ASP.NET运行Sql命令(执行存储过程)时,我们收到一个错误:
对象'myTableType'上的EXECUTE权限被拒绝, 数据库'ourDatabase',架构'ourSchema'。
为什么会这样?为什么我们需要为用户定义的表类型设置权限?为什么仅仅对使用它的存储过程设置权限是不够的?如果我们必须设置它,无论如何,为什么在属性窗口中没有设置EXECUTE
权限类型(我只能看到Control
,References
,Take Ownership
,View Definition
)?
我还不明白的是,在属性窗口中设置Control
权限可以解决问题,并且存储过程可以顺利运行。
答案 0 :(得分:175)
我真的希望你现在已经解决了这个问题,因为这个问题差不多已经有4个月了,但如果你没有这个问题,我认为这就是答案。
GRANT EXEC ON TYPE::[schema].[typename] TO [User]
GO
答案 1 :(得分:3)
如果您的存储过程使用动态sql,意味着生成@sql
然后通过exec @sql
执行,则需要在基础表上授予权限。
一个解决方法是modify to stored procedure to run as a different user。如果你让它作为SELF运行,它将在存储过程的创建者下运行,这是非常危险的。如果您没有其他选择,那么仍然可以:
CREATE PROCEDURE dbo.usp_Demo
WITH EXECUTE AS SELF