运行另一个用户拥有的存储过程的问题

时间:2009-07-14 14:58:30

标签: sql-server stored-procedures permissions sql-server-2000

我们有一个第三方应用,想要使用SQL 2005风格的“架构”语法调用存储过程:

Customer.InsertNewOrder

这个数据库仍然在SQL 2000上,所以我们试图使它“看起来”像SQL 2005模式,并且仍然正常工作(具有最低必要权限)。所以我们:

  1. 创建了一个名为“客户”的用户
  2. 创建该用户拥有的存储过程
  3. 授予Web用户对存储过程的“执行”权限(通过角色)
  4. 授予我们的Web用户执行权限通常只需运行dbo拥有的procs(如“dbo.InsertOrder”)。我们通常不必为基础表授予显式权限。但在这种情况下它似乎不起作用。我们收到了一个错误:

    INSERT permission denied on object "Order"
    

    那么我做错了什么?

    如何在此处告知 用户被拒绝的内容。是我的WebUser吗?或者它是“作为”客户用户执行,而客户用户需要其他权限? (我尝试向Customer用户授予额外权限(db_datareader和db_datawriter,甚至尝试过db_owner),但这似乎没有帮助。无论如何,db_owner不是生产中的选项。)

    我想我可以在必要的表上授予显式的INSERT权限,但是为什么在这种情况下这是必要的,而不是DBO拥有的proc的情况呢?

    修改
    为了这个问题,我已经简化了。实际上,我在两个不同的“模式”下有几十个存储过程,它们插入,更新和从许多表中进行选择。所以我希望不必手动逐项列出所有权限,如果我可以帮助它......

2 个答案:

答案 0 :(得分:2)

  

“当一个用户拥有源对象时   和所有目标对象,所有权   连锁据说是不间断的。如果   不同的用户拥有目标   对象,所有权链是   破碎。 SQL Server依赖于状态   所有权链的确定   何时检查权限。   
(剪辑)
  如果   所有权链被打破,SQL   服务器检查每个权限   由a拥有的分支机构   不同的用户。只有那些陈述   用户有必要的地方   权限将被执行,并且   剩下的陈述将得到一个   “权限不足”错误。通过这种方式,SQL Server允许对象所有者保留对权限的控制权。“

引自Using Ownership Chains

要将此应用于当前方案,当 Customer.InsertOrder proc尝试插入 dbo.Order 表时,这会破坏所有权链,并且SQL检查查看原始用户(在本例中为WebUser)是否有权执行插入。

因此,WebUser(非客户)需要获得INSERT到dbo.Order(显式或通过db_datawriter)的权限。如果需要,可以从客户删除所有权限。

答案 1 :(得分:-1)

这是客户用户。它需要数据编写者访问Order表。