场景:我们为经理批准的请求生成记录.待处理时,经理会更改(从人力资源供稿中一夜之间更新).我们需要更新请求以指示新经理.
这是查询的缩写版本,应该这样做:
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标准“.
这是一种耻辱,因为我所拥有的和Thomas的建议之间的区别在于我的内容中没有任何嵌套选择.如果有人知道ISO标准的方式来做这样的查询没有嵌套选择,我很想知道!
谢谢,托马斯!
解决方法
尝试将ISO批准的格式用于Update语句,看看是否有效. ISO不直接在Update语句中使用Join.相反,您只能通过子查询使用连接.
此外,这可能会说明原始Update语句中的一些问题,例如,用于设置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 )
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。