背景:
我有两个帐户用于同一个数据库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
但它仍然返回与权限相同的错误。我已将其删除为权限,因为当我尝试修改主帐户时,我就得到了
命令已成功完成。
答案 0 :(得分:2)
在进行了一些挖掘后,我需要添加的权限不是execute
,而是control
。
所以不要这样做;
grant execute on type::dbo.AFFECTEDSERVICELIST to subaccount
我实际上需要这样做;
grant control on type::dbo.AFFECTEDSERVICELIST to subaccount
答案 1 :(得分:2)
要使用用户定义的表格类型,您需要EXECUTE
或CONTROL
权限。
你的代码
grant execute on type::dbo.AFFECTEDSERVICELIST to subaccount
是对的。
这里缺少的是REFERENCES
权限:
grant references on type::dbo.AFFECTEDSERVICELIST to subaccount
这需要能够在代码中引用此类型。
要仅使用UDT创建proc,您只需要REFERENCES
权限。需要EXECUTE
或CONTROL
才能执行代码(proc)