从oracle数据库触发器运行windows命令

时间:2014-11-02 07:31:24

标签: windows oracle11g command

我在插入表后运行了oracle数据库(11g)触发器,我需要通过这个触发器运行外部程序通过这样的windows命令:

c:\my_external_apps\app1.exe arg1 arg2 arg3

我正在尝试此代码,但它不起作用:

create or replace TRIGGER GE_MAIN_NOTIFICATION_SEND AFTER INSERT ON TABLE 
REFERENCING OLD AS OLD NEW AS NEW FOR EACH ROW BEGIN 
SYS.DBMS_SCHEDULER.create_program(program_name => 'UPLOADNC', program_type => 'EXECUTABLE', 
program_action => 'C:\WINDOWS\SYSTEM32\CMD.exe /C c:\my_external_apps\app1.exe arg1 arg2 arg3 ', 
enabled => TRUE); 
END;

这是错误

ORA-04088: error during execution of trigger 'DURRA.GE_MAIN_NOTIFICATION_SEND'
27486. 00000 -  "insufficient privileges"
*Cause:    An attempt was made to perform a scheduler operation without the
       required privileges.
*Action:   Ask a sufficiently privileged user to perform the requested
       operation, or grant the required privileges to the proper user(s).

我怎么能这样做?我是oracle数据库的初学者

1 个答案:

答案 0 :(得分:1)

错误告诉您没有被授予调用dbms_scheduler.create_program所需的权限。我希望您错过了create job权限。

但是,如果您解决了这个问题,那么您的下一个问题是dbms_scheduler.create_program会进行隐式提交,并且不允许在触发器内部进行提交。这意味着您无法从触发器中调用dbms_scheduler.create_program(除非您将触发器设置为自动事务,这将创建一组单独的问题)。解决问题的正确方法几乎肯定是使用较旧的dbms_job包。由于该包不会隐式提交,因此您可以将作业作为较大事务的一部分提交。

当然,如果您使用dbms_job程序包来执行作业调度,则会失去dbms_scheduler调用操作系统的能力。相反,您需要执行诸如创建Java stored procedure that calls out to the operating system之类的操作。网上有很多这样的例子,我与Tom Kyte的一个例子有关。

因此,在较高级别,您的触发器会调用dbms_job.submit来提交作业。然后,该作业将调用您的Java存储过程。您的Java存储过程将实际调用数据库服务器的操作系统。