2014-11-02 2 views
0

У меня есть оракул база данных (11g) триггер запустить после установки на столе, мне нужно запустить внешнюю программу этого триггера через окна команды:запуск 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). 

как я могу сделай это?? i am beginner с базой данных 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

СПАСИБО !!! ВЫ МОЖЕТЕ СОХРАНИТЬ –

Смежные вопросы