2

我有一个由 SQL 用户执行的存储过程(调用它client.UpdateClient)(调用它MyWCFServicesUser

MyWCFServicesUser对数据库具有 datareader 和 datawriter 权限。它还具有存储过程的执行权限(但没有其他权限)。

client.Clientsproc 将在with中插入一行SET IDENITY_INSERT client.Client ON

当我使用集成安全性(我是)运行这个存储过程(来自 SSMS)时sa,一切正常。

当我以MyWCFServicesUser(来自 SSMS)的身份运行它时,它会因以下错误而失败:

消息 1088,级别 16,状态 11,过程 UpdateClient,第 33 行
找不到对象“client.Client”,因为它不存在或您没有权限。

我通常在默认 (dbo) 模式中拥有所有存储过程和表,但这次我试图不使用 dbo。

这就是我没有权限的原因吗?我需要以某种方式提升存储空间吗?还是用户?或者以某种方式改变架构?

我被难住了……

4

3 回答 3

4

原来 SET IDENTITY_INSERT 需要用户的更改权限。

于 2012-02-23T20:43:32.437 回答
3

解决存储过程中的权限要求的正确方法是使用代码签名。这样,您将所需的特权(即。ALTER TABLE)授予过程,而不是授予用户,并且您只需将过程(或模式)上的 EXECUTE 授予用户。优点是您的低权限用户只能调用该过程并执行任何需要由该过程控制的提升权限(即设置 identity_insert )的操作。如果您被直接授予用户所需的权限,他/她可以将其用于所述权限允许的任何操作(例如,添加列、删除约束等)。该链接有几个示例。

话虽如此,我必须指出您的问题是关于SET IDENTITY_INSERT,这是一种通常用于一次性数据加载的特殊设置。您从看起来像例行的 CRUDUpdateClient过程中设置它的事实有点代码味道。

于 2012-02-24T00:51:00.873 回答
0

重要的是你提到的物品的所有者是谁。它们有可能是由不同的用户创建的吗?也许 sa 是表的所有者,而 MyWCFServicesUser 拥有 proc?

请参阅有关所有权链的链接http://msdn.microsoft.com/en-us/library/ms188676.aspx它可能会帮助您进行调查

于 2012-02-23T20:26:57.677 回答