Sql server 低权限用户执行存储过程时的表权限

Sql server 低权限用户执行存储过程时的表权限,sql-server,sql-server-2008,sql-server-2008-r2,database-permissions,Sql Server,Sql Server 2008,Sql Server 2008 R2,Database Permissions,我有一个存储过程,称之为client.UpdateClient,由SQL用户执行,称之为MyWCFServicesUser MyWCFServiceUser对数据库具有datareader和datawriter权限。它还具有存储过程的执行权限,但没有其他权限 存储过程将在client.client中插入一行,并将IDENITY\u insert client.client设置为ON 当我使用集成安全性(我是sa)从SSMS运行此存储过程时,一切正常 当我从SSMS以MyWCFServicesUs

我有一个存储过程,称之为client.UpdateClient,由SQL用户执行,称之为MyWCFServicesUser

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

存储过程将在client.client中插入一行,并将IDENITY\u insert client.client设置为ON

当我使用集成安全性(我是sa)从SSMS运行此存储过程时,一切正常

当我从SSMS以MyWCFServicesUser身份运行它时,它会失败,并出现以下错误:

Msg 1088,16级,状态11,过程更新客户端,第33行 找不到对象客户端。客户端不存在或您没有权限

我通常将所有存储过程和表都放在默认的dbo模式中,但这次我尝试不使用dbo

这就是我没有权限的原因吗?我是否需要以某种方式提升存储过程?还是用户?或者以某种方式改变模式


我被难住了……

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


查看此有关所有权链的链接,它可能会帮助您进行调查

重要的是您提到的物品的所有者是谁。 有没有可能它们是由不同的用户创建的?也许sa是表的所有者,而MyWCFServiceUser是进程的所有者


查看此有关所有权链的链接它可能会帮助您进行调查。

结果表明,SET-IDENTITY\u-INSERT需要用户的更改权限。

结果表明,SET-IDENTITY\u-INSERT需要用户的更改权限。

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


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

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

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