2010-05-19 1 views
-1

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

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

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

+0

Вопрос действительно запутан. Вы хотите добавить информацию в базу данных Oracle из плоского сценария файла? Проблемы безопасности и дизайна этого решения заставляют меня головокружение. Сообщите нам, что вы на самом деле пытаетесь сделать, вместо того, чтобы описывать, что вы сделали. Это может помочь. – wlangstroth

+0

Ну, всякий раз, когда строка вставлена ​​в таблицу, в которой запущен триггер ROW-Level, затем запускается триггер, и он получает доступ к файлу sql sql, который обращается к файлу скрипта снаружи (т. Е. С жесткого диска). – AGeek

+0

мы можем добавить информацию в базу данных через обычный запрос INSERT, но затем после вставки запускается триггер, который делает возможное действие. – AGeek

ответ

4

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

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

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

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

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

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

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

Короче говоря, сохранение динамического кода в таблице, а не файла, было бы улучшением MASSIVE.

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

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

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

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

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

Что делать, если я хотел получить доступ к файлу ш, который делает некоторую обработку OS

Есть три способа выполнения ОС внутри базы данных.

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

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

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

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

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

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

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

  • Нет связанных вопросов^_^