Можем ли мы выполнить команду операционной системы из sqlite3 - PullRequest
5 голосов
/ 22 мая 2011

Мое требование: Запуск сценария оболочки при добавлении новой записи в таблицу.

Есть ли способ добавить триггер для запуска сценария оболочки при вставке новой строки?


Ну, ситуация такова:

Я использую БД другой программы. Скажем, программа X создает и заполняет xyz.db, и мне просто нужно выполнить небольшой скрипт всякий раз, когда программа X вставляет новую строку в таблицу.

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

Мой вопрос похож на мы можем выполнить команду unix из процедуры oracle10g , но мне нужно сделать то же самое в sqlite3

Ответы [ 2 ]

4 голосов
/ 22 мая 2011

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

В Java это можно сделать с помощью класса ProcessBuilder, метода system(<command>) в ruby ​​и os.system(<command>) в python.

В oracle можно писать триггеры в java, которые можно использовать для созданиясистемный вызов, однако эта функция не существует в sqlite.

Если это абсолютно необходимо, я бы предложил написать обертку вокруг вашего драйвера sqlite db и сделать там системный вызов.

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

Обновление:

Вы можете создать функцию обратного вызова в c / c ++, используя c/ c ++ sqlite интерфейс (см. Обратные вызовы уведомлений об изменении данных в http://www.sqlite.org/capi3ref.html), которые вы можете вызывать в своем триггере

CREATE TRIGGER <trigger name>
    INSERT ON <table_name>
    BEGIN
        SELECT callback_function()
    END;

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

1 голос
/ 22 мая 2011

Я просто хочу убедиться, что вы задаете правильный вопрос ...

Как вы говорите

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

, поэтому у вас есть что-то вроде

while true ; do
   $scriptPath/sqlCheckForNewValues.sh
    sleep ${sleepSecs:-60}
done

?

(Еслиу вас нет сна, а затем согласился, это не оптимально, и обратите внимание, что значение сна может быть настроено на время проверки, чтобы превысить ожидания пользователя (так что, возможно, 300 секунд достаточно). )

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

Из того, что вы описаливы потратите много времени на выяснение и кодирование решения этой проблемы, когда оно, вероятно, занимает не более 0,001% от общего времени обработки вашей системы.

Является ли этохорошо, или вы действительно можете количественно определить, что тего стоит потратить во времени?Разве у вас нет других возможностей, на которые лучше потратить это время?

IHTH

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