Oracle запускает запрос - PullRequest
0 голосов
/ 19 мая 2010

Давайте рассмотрим Table STUD и TRIGGER на уровне строк реализован по запросу INSERT. Мой сценарий выглядит следующим образом: всякий раз, когда вставляется строка, запускается триггер, и он должен получить доступ к некоторому файлу сценария, который находится в жестком диск, и в конечном итоге следует распечатать результат. Итак, возможно ли это? и если да, то эта вещь должна существовать в динамической форме, то есть если мы изменим содержимое файла сценария, то оракул также должен отразить эти изменения.

Я пытался сделать это для Java с использованием внешних процедур, но не очень доволен результатом, которого я хотел.

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

Ответы [ 2 ]

4 голосов
/ 19 мая 2010

Вики сообщества по причинам, почему это плохая идея.

Причины, по которым использование файла для динамического кода глупо.

  1. Каждая вставляемая строка должна открывать файл, читать все содержимое, анализировать его и «делать что-то» с результатом. Это будет медленным.

  2. В зависимости от среды ОС вы не сможете одновременно открыть файл для чтения и записи. Таким образом, вы можете обнаружить, что вам необходимо закрыть базу данных, чтобы «продвигать» изменения кода в файл.

  3. В зависимости от среды ОС вы можете даже обнаружить, что только один сеанс может одновременно считывать файл.

  4. Возможно, триггер прочитает файл в середине «сохранения» и выполнит частичный код.

  5. Защита файлов будет полностью отделена от защиты баз данных, что создает головную боль при обслуживании.

Короче говоря, сохранение динамического кода в таблице, а не в файле, было бы МАССИВНЫМ улучшением.

Причины, по которым вы все равно не должны использовать динамический код:

  1. Динамический код не был проанализирован / скомпилирован. Так что это может не сработать, и вы не узнаете, пока оно не будет выполнено.

  2. Статический код работает лучше, чем динамический код из-за уменьшения накладных расходов при разборе.

Разное. Причины

  1. Наличие триггера уровня строки для чтения и выполнения кода означает, что потенциально один и тот же оператор, вставляющий несколько записей в таблицу, может выбрать разные версии кода для выполнения для разных вставок строк.
1 голос
/ 19 мая 2010

Что если я захочу получить доступ к файлу sh, который выполняет некоторую обработку ОС

Существует три способа запуска ОС из базы данных.

  1. Внешние процедуры, которые являются обертками PL / SQL для библиотек ОС, написанных на C или Java. Доступно с Oracle 8.0. Узнайте больше .

  2. Хранимая процедура Java, эмулирующая команду host. Это свернутая вручную оболочка Java Runtime. Эта команда будет выполняться с мощными привилегиями пользователя ОС oracle, поэтому не подвергайте эту процедуру общему использованию. Вместо этого имейте защищенного пользователя, и пишите хранимые процедуры, чтобы раскрыть определенные элементы функциональности ОС (например, процедуру для выполнения mkdir, функцию для выполнения ls). Возможно начиная с Oracle 8i. Узнайте больше .

  3. DBMS_SCHEDULER. Помимо фоновых заданий базы данных мы можем использовать запланированные для запуска заданий ОС. Доступно с Oracle 10g. Узнать больше

Из этих трех вариантов, DBMS_SCHEDULER, вероятно, является наиболее безопасным вариантом. Как следует из названия, он предназначен для запуска программ по времени (например, Unix cron), поэтому он не подходит для запуска по требованию (скажем, через триггер). Однако может случиться так, что ваша бизнес-логика может быть удовлетворена без необходимости триггера. Внешние процедуры не предназначены для запуска сценариев оболочки.

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

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

...