用户定义的表类型被拒绝了EXECUTE权限?

112
我对 SQL Server 2008 中的用户定义表类型有疑问。
为了满足 ASP.NET 应用程序的需要,我们在 SQL Server 2008 上定义了自己的表类型,以便将它们用作存储过程中的参数(在 ASP.NET 应用程序中执行 SQL 命令时,我们将 DataTable 对象作为参数传递给存储过程在此处查看示例)。
问题是,当我们从 ASP.NET 运行 Sql 命令(执行存储过程)时,会出现错误:
“在对象 'ourTableType'、数据库 'ourDatabase'、架构 'ourSchema' 上拒绝了 EXECUTE 权限。”
为什么会这样?为什么我们需要设置用户定义表类型的权限?仅对使用它的存储过程设置权限不够吗?如果无论如何都必须设置权限,为什么属性窗口中没有要设置的EXECUTE权限类型(我只能看到ControlReferencesTake OwnershipView Definition)?
我还不明白的是,在属性窗口中将权限设置为Control可以解决问题,存储过程可以正常运行。

4
可能是存储过程中的表值参数在执行时遭遇了权限被拒绝的错误的重复问题。 - Damien_The_Unbeliever
谢谢!我已经搜索过了,但显然不够好。 - Janez
1
尝试在末尾加上 AS dbo。像这样:GRANT EXEC ON TYPE::[schema].[typename] TO [User] AS dbo。对我有用。 - Jonathan
3个回答

250

我真的希望你现在已经解决了这个问题,因为这个问题已经存在了将近4个月了。但是,如果你还没有解决它,这里是我认为的答案。

GRANT EXEC ON TYPE::[schema].[typename] TO [User]
GO

12
我的两分钱意见:根据您的连接身份验证机制,您可能需要授予公共组执行权限。因此,您的授权将如下所示:GRANT EXEC ON TYPE::[模式].[类型名称] TO [Public] GO - Sudhanshu Mishra
1
@dotnetguy非常感谢,除了你的解决方案,其他的都没有对我起作用。 - Mazen el Senih

3
如果您的存储过程使用动态SQL,即生成并通过"exec @sql"执行@sql,则需要授予底层表的权限。其中一个解决方法是修改存储过程以使用不同的用户运行。如果将其运行为SELF,则会在创建存储过程的用户下运行,这非常危险。尽管如此,如果您没有其他选择:
CREATE PROCEDURE dbo.usp_Demo
WITH EXECUTE AS SELF

1
谢谢指出这一点。但是存储过程中没有任何动态SQL。只有一般的INSERT INTOUPDATE表语句,对于这些语句,该用户拥有所需的所有权限。此外,此用户/登录账户是专门为此ASP.NET应用程序保留/创建的,以便能够连接到此数据库并仅执行存储过程(不包括创建等,创建者始终为“sa”)。 - Janez
谢谢,那就是我的问题。其他遇到这个问题的读者可以参考SQL Server Permissions on Stored Procs with dynamic SQL获取更多提示。 - Nickolay

0
在SSMS中,您需要先点击“查看架构权限”链接,再点击“搜索”按钮。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接