我有一个由SQL用户执行的sproc(称之为client.UpdateClient
)(称之为MyWCFServicesUser
。
MyWCFServicesUser
对数据库具有datareader和datawriter权限。它还具有对sproc的执行权限(但没有其他权限)。
sproc会使用client.Client
在SET IDENITY_INSERT client.Client ON
中插入一行。
当我使用集成安全性(我是sa
)运行此sproc(来自SSMS)时,一切正常。
当我以MyWCFServicesUser
(来自SSMS)运行时,它会因此错误而失败:
Msg 1088,Level 16,State 11,Procedure UpdateClient,Line 33
找不到对象“client.Client”,因为它不存在或者您没有权限。
我通常在默认(dbo)架构中拥有所有的sprocs和table,但这次我不想使用dbo。
这就是我没有权限的原因吗?我需要以某种方式提升sproc吗?还是用户?或者以某种方式改变架构?
我很难过......
答案 0 :(得分:3)
事实证明,SET IDENTITY_INSERT需要用户更改权限。
答案 1 :(得分:2)
解决存储过程中权限要求的正确方法是使用code signing。这样,您将所需的权限(即ALTER TABLE
)授予过程,而不是用户,并且您只需要将过程(或模式)的EXECUTE授予用户。优点是您的低权限用户只能调用该过程并执行任何需要提升权限的操作(即设置identity_insert),这是由过程控制的。如果您已直接向用户授予所需权限,则他/她可以将其用于所述权限允许的任何操作(例如,添加列,删除约束等等)。该链接有几个例子。
话虽如此,我必须说出你的问题是关于SET IDENTITY_INSERT
,这是一个通常用于一次性数据加载的特殊设置。你从一个看似常规的CRUD UpdateClient
程序设置它的事实是一点代码味道。
答案 2 :(得分:0)
重要的是谁是您提到的对象的所有者。 他们是否有机会由不同的用户创建?也许sa是表的所有者,MyWCFServicesUser拥有proc?
请参阅此链接,了解所有权链[{3}},它可能会帮助您进行调查