更新联接的权限不足

时间:2011-10-07 14:49:51

标签: oracle join permissions sql-update

场景:我们为经理批准的请求生成记录。待处理时,经理会更改(从人力资源供稿中一夜之间更新)。我们需要更新请求以指示新经理。

这是 应该这样做的查询的缩写版本:

update (select grw.approver_user_id, gup.supervisor_id
        from   gs3.user_role gur
          join gsu.user_profile gup
            on gur.user_id = gup.user_id
          join gs3.request_workflow grw
            on gur.user_role_id = grw.user_role_id
           and gup.supervisor_id != grw.approver_user_id  -- records with new mgr
        where  grw.auth_status_cd = 'SUBMITTED')  -- reapprovals currently open
set    grw.approver_id = gup.supervisor_id;


问题:执行此查询的帐户仅具有gsu.user_profile的读取权限。

内部选择工作正常并返回我需要更新的所有行...但即使我没有更新gup.supervisor_id,似乎我需要对该表具有写访问权限。如果我以对gsu.user_profile具有写访问权限的用户执行此操作,则更新成功。

这有合理的原因吗?我宁愿不向其不需要的帐户授予权限。

谢谢!


更新

接受托马斯的回答......虽然它并没有真正回答我为什么执行更新加入的帐户需要更新权限而不更新的表的问题,但我可以看到“不要使用”的逻辑更新连接,它们不是ISO标准“。

这是一种耻辱,因为我所拥有的和托马斯的建议之间的区别在于我的内容中没有任何嵌套选择。如果有人知道ISO标准的方式来做这样的查询没有嵌套选择,我很想知道!

谢谢,托马斯!

1 个答案:

答案 0 :(得分:2)

尝试将ISO批准的格式用于Update语句,看看是否有效。 ISO不直接在Update语句中使用Join。相反,您只能通过子查询使用连接。

此外,如果用于设置approver_id的子查询返回多行显然会导致异常,并且您需要确定如何找到应该为每一行设置的唯一一个supervisor_id。

Update gs3.request_workflow
Set approver_id =   (
                    Select gup.supervisor_id
                    From gs3.user_role As gur
                        Join gsu.user_profile As gup
                            On gur.user_id = gup.user_id
                    Where gup.user_role_id = gs3.request_workflow.user_role_id
                        And gup.supervisor_id != grw.approver_user_id
                    )
Where auth_status_cd = 'SUBMITTED'                          
    And Exists  (
                Select 1
                From gs3.user_role As gur
                    Join gsu.user_profile As gup
                        On gur.user_id = gup.user_id
                Where gup.user_role_id = gs3.request_workflow.user_role_id
                    And gup.supervisor_id != grw.approver_user_id
                )