更新连接权限不足
问题描述:
场景:我们为要求经理批准的请求生成记录。在等待处理时,管理员会更改(从HR提要中过夜更新)。我们需要更新请求以指示新的经理。更新连接权限不足
这里的查询的简化版本,
会
应该这样做:
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标准方法,我很想知道!
谢谢,托马斯!
答
尝试使用ISO批准的格式更新语句,看看是否有效。 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
)
因此,像这样的选择做更新的能力是Oracle特有的? –
@James B - 将联接烘焙到Update语句中的能力是供应商特定的,尽管供应商之间存在一些相似之处。微软例如允许一个From子句,你可以把Joins。 MySQL将这些连接直接放入我认为Oracle也提供的Update子句中。他们都有他们的细微差别。但是,所有供应商都支持ISO格式,这就是为什么我提出这个格式的原因,并且在可能出现问题的地方更清晰。 – Thomas
也想问,你为什么说用于设置approver_id的子查询返回多个行,并会导致异常?如果我在另一个帐户下运行它,我写的查询将会正常执行,并正确更新290行。 我错过了什么吗? –