使用用户定义的表类型需要什么权限

时间:2017-10-17 10:09:40

标签: sql-server tsql stored-procedures

背景:

我有两个帐户用于同一个数据库1" master"帐户和我用于我的网站连接到服务器的另一个(子)帐户,以便我可以管理用户可以做什么和不能做什么。在我访问之前,此帐户上的许多权限已经存在,所以除了我管理的权限之外,我不知道所有权限到底是什么。

有一个用户定义的表类型,其他人创建了一个,不要问我为什么这样做,

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类型时,子帐户无法运行或修改此存储过程,因为它会收到错误

  

找不到类型' AffectedServiceList',因为它不存在   或者你没有得到许可。

我尝试过这样做grant execute on type::dbo.AFFECTEDSERVICELIST to subaccount

但它仍然返回与权限相同的错误。我已将其删除为权限,因为当我尝试修改主帐户时,我就得到了

  

命令已成功完成。

2 个答案:

答案 0 :(得分:2)

在进行了一些挖掘后,我需要添加的权限不是execute,而是control

所以不要这样做;

grant execute on type::dbo.AFFECTEDSERVICELIST to subaccount

我实际上需要这样做;

grant control on type::dbo.AFFECTEDSERVICELIST to subaccount

答案 1 :(得分:2)

要使用用户定义的表格类型,您需要EXECUTECONTROL权限。 你的代码

grant execute on type::dbo.AFFECTEDSERVICELIST to subaccount

是对的。

这里缺少的是REFERENCES权限:

grant references on type::dbo.AFFECTEDSERVICELIST to subaccount

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

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