用户定义的表类型是否拒绝EXECUTE权限?


87

我对SQL Server 2008中的用户定义表类型有疑问。

为了满足ASP.NET应用程序之一的需要,我们在SQL Server 2008上定义了自己的表类型,以将它们用作存储过程中的参数(在ASP.NET应用程序中执行sql命令时,我们将DataTable对象作为存储过程的参数传递请看这里的例子

问题是,当我们从ASP.NET运行Sql命令(执行存储过程)时,出现错误:

对对象'ourTableType',数据库'ourDatabase',模式'ourSchema'的EXECUTE权限被拒绝。

为什么呢?为什么我们需要对用户定义的表类型设置权限?为什么仅在使用权限的存储过程上设置权限还不够?如果我们要设置它,不管是什么,为什么没有EXECUTE在属性窗口的任何许可类型集(我只看到ControlReferencesTake OwnershipView Definition)?

我还不明白的是,Control在属性窗口中将权限设置为可以解决问题,并且存储过程可以正常运行。



谢谢!我已经搜索过,但显然不够好:/
Janez

尝试放在AS dbo最后。像这样:GRANT EXEC ON TYPE::[schema].[typename] TO [User] AS dbo。为我工作。
乔纳森

Answers:


197

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

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

9
我的2美分:根据您的连接身份验证机制,您可能必须将exec授予Public组。因此,您的资助应如下所示:GRANT EXEC ON TYPE :: [schema]。[typename] TO [Public] GO
Sudhanshu Mishra 2015年

@dotnetguy非常感谢您,除了您之外,所有解决方案都不适用于我。
Mazen el Senih

3

如果您的存储过程使用的是动态sql,则意味着将@sql生成,然后通过来执行exec @sql,则需要在基础表上授予权限。

一种解决方法是将存储过程修改为以其他用户身份运行。如果将其设置为SELF运行,它将在存储过程的创建者下运行,这非常危险。不过,如果您没有其他选择:

CREATE PROCEDURE dbo.usp_Demo
WITH EXECUTE AS SELF

1
谢谢你指出这一点。但是存储过程中没有任何动态sql。仅INSERT INTO该用户拥有其所需的所有权限的常规和“ UPDATE”表语句。同样,此ASP.NET应用程序特别保留/创建了此用户/登录名,以便能够连接到该数据库并仅执行存储过程(不创建等,创建者始终为'sa')。
珍妮兹

谢谢,这是我的问题。其他有此问题的读者可以参考带有动态SQL的存储过程上的SQL Server权限,以获取更多提示。
Nickolay
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.