Oracle:有没有办法授予角色运行作业的能力?

Chr*_*lly 2 oracle role jobs

我们在 11.2 数据库中有几个 dbms_scheduler 作业,我们希望具有特定角色的用户能够运行这些作业。因此,我们不想将直接运行的能力授予用户,因为它会更难以维护。

根据 Oracle 的文档,授予ALTER JOB用户权限将允许他们运行作业。不幸的是,这似乎并没有扩展到角色:我可以GRANT很好地运行该语句,并且该作业向ALL_SCHEDULER_JOBS用户显示,但尝试运行该作业会导致以下错误:

ORA-27476: "S1.J1" does not exist
ORA-06512: at "SYS.DBMS_ISCHED", line 185
ORA-06512: at "SYS.DBMS_SCHEDULER", line 486
ORA-06512: at line 1
Run Code Online (Sandbox Code Playgroud)

鉴于 DBMS_SCHEDULER 是 AUTHID USER,但 DBMS_ISCHED 是 AUTHID DEFINER,我是不是运气不好?或者有什么方法可以将它授予角色而不是用户?

And*_*lfe 5

这听起来像是存储过程的常见问题:当它们由开发人员 A 在他的模式中编译时,编译器只考虑直接授予 A 的权限 - 好像在编译之前所有角色都被剥离了。这通常通过将您的过程编写为 AUTHID CURRENT_USER 来解决,但如果该过程调用通过角色授予的另一个过程,它可能会失败。

通常,您想要编译成 PL/SQL 对象的任何内容似乎都必须直接授予您。我已经编写了许多脚本来将角色授予的权限转换为直接发送给过程所有者的 GRANT 语句,以便它进行编译。

请注意,这不适用于匿名块 - 它们可以利用您当前角色的特权进行编译和运行。

所以我认为调度程序是另一种情况,您必须像角色不存在一样进行编码。这是一种痛苦,我讨厌它,但事情就是这样。