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数据库的初学者
答案 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存储过程将实际调用数据库服务器的操作系统。