2014-11-02 32 views
0

我有Oracle数据库(11克)触发运行插入表后,我需要通过这个触发通过Windows运行外部程序命令是这样的:运行Windows从Oracle数据库触发命令

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

错误是告诉你你没有被授予调用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存储过程将实际调用数据库服务器的操作系统。

+0

谢谢!你是我的HEEERROOOOOOOOO – 2014-11-02 10:48:05