我需要哪些权限才能使用用户定义表类型?

10

背景:

我有两个账户用于同一个数据库,一个是“主账户”,另一个是(子)账户,我用它来连接服务器,以便管理用户所能够和不能做的事情。在我获得访问权限之前,这个账户上已经拥有了很多权限,所以我不知道所有权限是什么,除了我自己管理的那些。

某个人创建了一个用户定义的表类型,为什么他们这样做,我就不知道了。

CREATE TYPE [dbo].[AffectedServiceList] AS TABLE(
    [AffSerName] [nvarchar](200) NULL
)
GO

这种类型在存储过程中的使用方式如下:

ALTER PROCEDURE [dbo].[Contractsetup]  @OtherParams, --Easier than typing them all
                                       @list        dbo.AFFECTEDSERVICELIST READONLY

主账户可以完美地执行和修改此存储过程,但子账户在使用AffectedServiceList类型时无法运行或修改此存储过程,因为它会出现以下错误:
Cannot find the type 'AffectedServiceList', because it does not exist or you do not have permission.
我尝试过执行以下命令:grant execute on type::dbo.AFFECTEDSERVICELIST to subaccount
但仍然返回相同的权限错误。我确定这是一个权限问题,因为当我在主账户上尝试修改时,只会显示:
Command(s) completed successfully.
2个回答

10

要使用用户定义的表类型,您需要对其具有EXECUTECONTROL权限。 您的代码

grant execute on type::dbo.AFFECTEDSERVICELIST to subaccount

是正确的。

这里缺少的是REFERENCES权限:

grant references on type::dbo.AFFECTEDSERVICELIST to subaccount

这需要在代码中引用此类型。

只需使用UDT创建proc,您只需要REFERENCES权限。要执行代码(proc),需要EXECUTECONTROL权限。


创建过程很顺利,因为我是在主账户上创建的,只需要在子账户上执行它的权限即可。 - WhatsThePoint

3

经过更深入的调查,我需要添加的权限不是execute,而是control

所以,不要这样做;

grant execute on type::dbo.AFFECTEDSERVICELIST to subaccount

我实际上需要这样做;


grant control on type::dbo.AFFECTEDSERVICELIST to subaccount

这是错误的:使用EXECUTE权限足以使用用户定义的表类型创建存储过程。 - sepupic
2
对不起,您还需要REFERENCES权限。 - sepupic

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