我们有一个第三方应用,想要使用SQL 2005风格的“架构”语法调用存储过程:
Customer.InsertNewOrder
这个数据库仍然在SQL 2000上,所以我们试图使它“看起来”像SQL 2005模式,并且仍然正常工作(具有最低必要权限)。所以我们:
授予我们的Web用户执行权限通常只需运行dbo拥有的procs(如“dbo.InsertOrder”)。我们通常不必为基础表授予显式权限。但在这种情况下它似乎不起作用。我们收到了一个错误:
INSERT permission denied on object "Order"
那么我做错了什么?
如何在此处告知 用户被拒绝的内容。是我的WebUser吗?或者它是“作为”客户用户执行,而客户用户需要其他权限? (我尝试向Customer用户授予额外权限(db_datareader和db_datawriter,甚至尝试过db_owner),但这似乎没有帮助。无论如何,db_owner不是生产中的选项。)
我想我可以在必要的表上授予显式的INSERT权限,但是为什么在这种情况下这是必要的,而不是DBO拥有的proc的情况呢?
修改
为了这个问题,我已经简化了。实际上,我在两个不同的“模式”下有几十个存储过程,它们插入,更新和从许多表中进行选择。所以我希望不必手动逐项列出所有权限,如果我可以帮助它......
答案 0 :(得分:2)
“当一个用户拥有源对象时 和所有目标对象,所有权 连锁据说是不间断的。如果 不同的用户拥有目标 对象,所有权链是 破碎。 SQL Server依赖于状态 所有权链的确定 何时检查权限。
(剪辑)
如果 所有权链被打破,SQL 服务器检查每个权限 由a拥有的分支机构 不同的用户。只有那些陈述 用户有必要的地方 权限将被执行,并且 剩下的陈述将得到一个 “权限不足”错误。通过这种方式,SQL Server允许对象所有者保留对权限的控制权。“
要将此应用于当前方案,当 Customer.InsertOrder proc尝试插入 dbo.Order 表时,这会破坏所有权链,并且SQL检查查看原始用户(在本例中为WebUser)是否有权执行插入。
因此,WebUser(非客户)需要获得INSERT到dbo.Order(显式或通过db_datawriter)的权限。如果需要,可以从客户删除所有权限。
答案 1 :(得分:-1)
这是客户用户。它需要数据编写者访问Order表。