在 Oracle 触发器代码中使用“exec”并失败

Posted

技术标签:

【中文标题】在 Oracle 触发器代码中使用“exec”并失败【英文标题】:Using 'exec' in Oracle trigger code and failed 【发布时间】:2017-03-10 02:16:19 【问题描述】:

我尝试创建一个Oracle触发器,在插入或更新表后,触摸Linux主机中的一个文件。

所以我创建了一个这样的 shell 脚本:

#!/bin/bash
sqlplus $oam <<EOF
spool /ocs/ocsrun/other/gx_working/select.txt;
@/ocs/ocsrun/other/gx_working/select.sql;
spool off;
exit;
EOF
touch  /export/home/oracle/shell/a.txt

并修改权限:

chmod 777 test1.sh

然后我使用 sys 登录 oracle 并创建一个调度程序作业,如下所示:

SQL>  exec DBMS_SCHEDULER.CREATE_JOB(job_name=>'test1',job_type=>'EXECUTABLE',job_action=>'/export/home/oracle/shell/test1.sh');
PL/SQL procedure successfully completed.

现在我想创建一个 Oracle 触发器并像这样调用这个调度程序作业:

CREATE OR REPLACE TRIGGER MY_OAM_LOG
 AFTER INSERT OR UPDATE ON OCS_CHARGE_OFF_AUTOMATION
 FOR EACH ROW 
BEGIN
 DBMS_SCHEDULER.RUN_JOB(job_name=>'test1');
END;
/

当我更新这个表时,错误如下:

ERROR at line 1:
ORA-27369: job of type EXECUTABLE failed with exit code: No such file or
directory
ORA-06512: at "SYS.DBMS_ISCHED", line 185
ORA-06512: at "SYS.DBMS_SCHEDULER", line 486
ORA-06512: at "OAM.MY_OAM_LOG", line 2
ORA-04088: error during execution of trigger 'OAM.MY_OAM_LOG'

我从管理指南中搜索了一些文档,例如 exapmle 27-5: http://download.oracle.com/docs/cd/B28359_01/server.111/b28310/scheduse002.htm#i1032197

错误是一样的,在我改变我的shell脚本之后:

#!/bin/bash
export ORACLE_HOME=/opt/oracle/instantclient
export ORACLE_SID=ocsdb
sqlplus $oam <<EOF
spool /ocs/ocsrun/other/gx_working/select.txt;
@/ocs/ocsrun/other/gx_working/select.sql;
spool off;
exit;
EOF
touch  /export/home/oracle/shell/a.txt

shell 可以独立运行,请问如何与它双重运行?plz

【问题讨论】:

旁白:从不使用chmod 777。永远不会。不是为了测试。暂时不行。在任何情况下。设置这些权限允许不受信任的用户(例如验证入站 Internet 连接的帐户)对另一个帐户正在执行的文件具有写入访问权限。这天生就是一种完全不可接受的安全做法。 ...至于直接错误,就个人而言,我将从跟踪 Oracle 在实践中实际执行的操作开始,即。与sysdig。确定它是否实际上以/export/home/oracle/shell/test1.sh 作为参数调用execv-family 系统调用,以及该系统调用的结果是什么,对于理解问题大有帮助。 (顺便说一下,那个脚本看起来不太对——它有一个heredoc片段的一部分,但它不包含任何开始你的heredoc的东西;应该有一行以&lt;&lt;EOF 开头,该部分仅包含EOF 的行结束)。 是的,应该有一个 【参考方案1】:

很可能找不到 sqlplus 命令,因为从 Oracle 数据库执行时,您会丢失所有环境设置。因此,请在脚本的开头设置必要的路径,或输入 sqlplus 等命令的完整路径。

【讨论】:

以上是关于在 Oracle 触发器代码中使用“exec”并失败的主要内容,如果未能解决你的问题,请参考以下文章

Oracle中执行存储过程call和exec区别

exec...的docker中的EXEC

Oracle 中 call 和 exec的区别

Oracle:搜索所有存储的过程/触发器/其他数据库代码?

Backup Exec 16中配置Oracle备份

GO 在 EXEC 中使用时会导致错误:“'GO' 附近的语法不正确。”