Поместить событие в журнал событий Windows с Oracle - PullRequest
1 голос
/ 16 мая 2019

Это продолжение этого вопроса .

У меня были проблемы с 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 #), текстовое сообщение, содержащее содержимое сообщения журнала пользователя, автоматически отправляется на сотовые телефоны меня и нескольких других администраторов.

Это чрезвычайно полезнопоскольку это дает нам немедленное уведомление о том, что произошло какое-то важное событие, и мы можем точно контролировать, какие события мы хотим включить и какую конкретную информацию об этих событиях мы хотим получать.

Вот несколько примерово чем мы сейчас получаем уведомление с помощью текстового сообщения:

  1. Остановка или запуск любого из наших пользовательских приложений (и кто остановил / запустил его, если он не потерпел крах).
  2. Когда какое-либо из наших пользовательских приложений взято под контроль сторожевого устройства (и кто это сделал).
  3. Когда возникают или собираются возникнуть определенные "известные проблемы", которые мы еще не полностью исправили.Это позволяет нам «опережать игру», чтобы мы могли активно ее решать, а не ждать, пока кто-нибудь расскажет нам об этом.

Я хочу расширить эту функциональность до некоторых событий в нашемБаза данных Oracle (именно поэтому я пытаюсь поместить событие в журнал событий на основе триггера в Oracle).

Вот некоторые вещи, которые я имею в виду на данный момент, о которых мы хотим получать уведомления черезтекстовое сообщение, все из которых могут быть определены внутри триггера:

  1. Когда кто-либо из определенного «одобренного» списка пользователей (которым будут наши администраторы плюс пользовательские приложения с подключениями к Oracle) подключается к нашей базе данных Oracle. Это можно сделать с помощью триггера входа. (На самом деле, у меня уже есть этот работающий, так как триггеры входа в систему вызываются схемой SYS, поэтому у меня нет проблем с другими схемами, которые не в состоянии выполнить задание. Но ... так как я все еще не могу измените любые аргументы, лучшее, что я могу сейчас сделать, это просто сказать "Someone" not approved logged into Oracle database.... Было бы намного полезнее, если бы я мог передать имя пользователя в журнал событий Windows.)

  2. Когда что-либо кроме наших пользовательских приложений изменяет данные в нашей базе данных Oracle. (Наши пользовательские приложения обрабатывают все вставки / обновления / удаления и т. Д. Только в очень редких случаях нам нужно будет что-то модифицировать вручную. Мы хотим получать уведомления, когда любой [включая меня самого или другие администраторы] изменяет что-либо в базе данных.) Это можно сделать с помощью триггера обновления / вставки / удаления для каждой таблицы.

Ответы [ 2 ]

1 голос
/ 21 мая 2019

проблема с разрешениями уже решена в другом ответе. Для проблемы «фиксация внутри триггера» существует PRAGMA AUTONOMOUS_TRANSACTION. Смотрите в нижней части этой ссылки пример: https://docs.oracle.com/cd/B14117_01/appdev.101/b10807/13_elems002.htm. Он делает именно то, что вы хотите.

1 голос
/ 18 мая 2019

Причина, по которой он работает под SYS , заключается в том, что это специальная привилегированная учетная запись. Вам необходимо создать новые учетные данные и сопоставить их с заданием

Решением будет создание учетных данных с DBMS_SCHEDULER.CREATE_CREDENTIAL вместе с учетной записью ОС, которая имеет достаточные привилегии, и назначение этих новых учетных данных для вашей работы.

Если честно, вопрос о триггере пока не знаю.

Редактировать - решение, основанное на использовании субтранзакции Oracle

После обновления ОП и реакции на комментарии:

Исходя из рабочего процесса, я думаю, что лучше использовать внутреннее уведомление Oracle для проведения отзывчивого аудита. Я думаю, что попытка взломать себя в журнал событий Windows с помощью внешнего приложения приносит еще один ненужный уровень сложности.

Я бы создал таблицу в БД, где я бы хранил все события, а поверх этой таблицы я бы создал Задание с уведомлениями (SMS, почта и т. Д.), Которое будет запускаться, если произойдет какое-либо изменение в таблице журнала.

Чтобы использовать триггеры при возникновении ошибки, вы должны использовать PRAGMA autonomous_transaction из своей основной области (позволяет выполнять субтранзакцию). Это позволит вам совершить любой DML, который вы можете иметь, но сделайте откат остальным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...