存储过程中的表值参数获取执行权限被拒绝错误

aru*_*ira 21 .net sql-server enterprise-library

调用具有表值参数作为参数之一的存储过程时,我收到以下错误

EXECUTE对象'ValidationErrors' 的权限被拒绝

ValidationErrors是使用以下语句创建的TVP:

CREATE TYPE [dbo].[ValidationErrors] AS TABLE(
    [ErrorMessage] [varchar](255) NOT NULL
)
Run Code Online (Sandbox Code Playgroud)

执行存储过程的用户对存储过程具有执行权限.但是,我仍然得到上述错误.有任何想法吗?

Ada*_*Dev 36

我认为您可能还需要授予用户对该类型的权限.

GRANTing对类型的权限的引用:
SQL 2005
SQL 2008

更新:
Re:当您拥有对sproc的权限时,为什么必须为该类型授予权限.我不知道确切的原因,但BOL说:

与使用sp_addtype创建的用户定义类型不同,公共数据库角色不会自动为使用CREATE TYPE创建的类型授予REFERENCES权限.必须单独授予此权限.

更新2: 要获得GRANT EXECUTE权限,您可以在SSMS中运行它:

GRANT EXECUTE ON TYPE::dbo.ValidationErrors TO SomeUser;
Run Code Online (Sandbox Code Playgroud)

  • @chiefbrownbotom:存储过程可以解决在*物理表或视图*上设置权限的需要,但是TVP不仅仅用在*存储过程中,而是传递给存储过程*.换句话说,需要在调用SP之前创建TVP实例; 因此,仍然需要在TVP本身上授予权限. (4认同)
  • 我看到没有地方可以从sql管理工作室授予执行权.我只看到了上面列出的那些.我是否必须使用t-sql来授予此权限? (2认同)