Это продолжение этого вопроса .
У меня были проблемы с Oracle, выполняющим команду eventcreate
Windows с DBMS_SCHEDULER
.
AsВ качестве обходного пути я вместо этого создал базовое приложение на C # для выполнения той же функции eventcreate
.Он работает на базовом уровне, но я сталкиваюсь с несколькими препятствиями.
Вот программа.(Я не помечаю C # в этом вопросе, потому что вопрос не о C #. Я просто предоставляю это только в качестве информации.)
using System;
using System.Diagnostics;
class myEventCreateClass
{
public static void Main(String[] args)
{
using(EventLog eventLog = new EventLog("Application"))
{
eventLog.Source = "MySource";
eventLog.WriteEntry(args[0], EventLogEntryType.Warning, 218);
}
}
}
Я изменил задание DBMS_SCHEDULER
так:
BEGIN
sys.dbms_scheduler.create_job(
job_name => 'SYS.TESTJOB',
job_type => 'EXECUTABLE',
job_action => 'C:\myEventCreate.exe',
job_class => 'DEFAULT_JOB_CLASS',
number_of_arguments => 1,
auto_drop => FALSE,
enabled => FALSE);
sys.dbms_scheduler.set_job_argument_value('SYS.TESTJOB', 1, 'testing123');
sys.dbms_scheduler.enable('SYS.TESTJOB');
END;
Когда я запускаю это задание вручную в схеме SYS
, оно успешно помещает событие в журнал событий Windows, который говорит:
testing123
На этом мой успех заканчивается ...
Если я создаю одно и то же задание в другой схеме (например, изменяю все экземпляры SYS.TESTJOB
на MYSCHEMA.TESTJOB
), оно создает задание в этой схеме, но когда я пытаюсь запустить задание (из любой схемы) Я получаю следующий длинный список ошибок:
ORA-27370: job slave failed to launch a job of type EXECUTABLE
ORA-27300: OS system dependent operation:accessing job scheduler service failed with status: 2
ORA-27301: OS failure message: The system cannot find the file specified.
ORA-27302: failure occurred at: sjsec 6a
ORA-27303: additional information: The system cannot find the file specified.
ORA-06512: at "SYS.DBMS_ISCHED", line 185
ORA-06512: at "SYS.DBMS_SCHEDULER", line 486
ORA-06512: at line 1
И когда я пытаюсь запустить SYS.TESTJOB
из MYSCHEMA
, он говорит мне, что работа не существует:
ORA-27476: "SYS.TESTJOB" does not exist
ORA-06512: at "SYS.DBMS_ISCHED", line 185
ORA-06512: at "SYS.DBMS_SCHEDULER", line 486
ORA-06512: at line 1
Как я могу заставить эту работу работать из схемы, отличной от SYS
?
Еще одна проблема (возможно, более серьезная): я пытаюсь запустить эту работу изнутритриггер.
В соответствии с этот вопрос , изменение настроек задания DBMS_SCHEDULER
(в моем случае я пытаюсь изменить аргументы задания каждый раз, прежде чем запускать задание) вызывает неявное COMMIT
в Oracle, что не допускается в триггерах.
Мне кажется, что для Oracle это вводит в заблуждениедаже пометить их как «аргументы», потому что значения аргументов зафиксированы внутри задания, а изменение аргументов означает изменение самого задания.
В любом случае, принятый ответ в этом вопросе гласит: DBMS_JOB
поскольку это неявно COMMIT
, но я не могу найти способ использовать DBMS_JOB
для запуска внешнего .exe
файла.
Следовательно, возможно ли каким-либо образом изменить это задание, чтобы разрешитьдинамические аргументы задания?
Я также открыт для других решений, но из того, что я прочитал, DBMS_SCHEDULER
, кажется, лучший способ сделать это.
В соответствии с просьбой, вот некоторый контекст для того, что я пытаюсь выполнить:
В моей компании он настроен так, что, если запись помещается в журнал событий Windows из определенного источника (например, вв этом случае, mySource
, как показано в прилагаемом приложении C #), текстовое сообщение, содержащее содержимое сообщения журнала пользователя, автоматически отправляется на сотовые телефоны меня и нескольких других администраторов.
Это чрезвычайно полезнопоскольку это дает нам немедленное уведомление о том, что произошло какое-то важное событие, и мы можем точно контролировать, какие события мы хотим включить и какую конкретную информацию об этих событиях мы хотим получать.
Вот несколько примерово чем мы сейчас получаем уведомление с помощью текстового сообщения:
- Остановка или запуск любого из наших пользовательских приложений (и кто остановил / запустил его, если он не потерпел крах).
- Когда какое-либо из наших пользовательских приложений взято под контроль сторожевого устройства (и кто это сделал).
- Когда возникают или собираются возникнуть определенные "известные проблемы", которые мы еще не полностью исправили.Это позволяет нам «опережать игру», чтобы мы могли активно ее решать, а не ждать, пока кто-нибудь расскажет нам об этом.
Я хочу расширить эту функциональность до некоторых событий в нашемБаза данных Oracle (именно поэтому я пытаюсь поместить событие в журнал событий на основе триггера в Oracle).
Вот некоторые вещи, которые я имею в виду на данный момент, о которых мы хотим получать уведомления черезтекстовое сообщение, все из которых могут быть определены внутри триггера:
Когда кто-либо из определенного «одобренного» списка пользователей (которым будут наши администраторы плюс пользовательские приложения с подключениями к Oracle) подключается к нашей базе данных Oracle. Это можно сделать с помощью триггера входа. (На самом деле, у меня уже есть этот работающий, так как триггеры входа в систему вызываются схемой SYS
, поэтому у меня нет проблем с другими схемами, которые не в состоянии выполнить задание. Но ... так как я все еще не могу измените любые аргументы, лучшее, что я могу сейчас сделать, это просто сказать "Someone" not approved logged into Oracle database...
. Было бы намного полезнее, если бы я мог передать имя пользователя в журнал событий Windows.)
Когда что-либо кроме наших пользовательских приложений изменяет данные в нашей базе данных Oracle. (Наши пользовательские приложения обрабатывают все вставки / обновления / удаления и т. Д. Только в очень редких случаях нам нужно будет что-то модифицировать вручную. Мы хотим получать уведомления, когда любой [включая меня самого или другие администраторы] изменяет что-либо в базе данных.) Это можно сделать с помощью триггера обновления / вставки / удаления для каждой таблицы.