Выполнение команды оболочки из MySQL - PullRequest
3 голосов
/ 14 ноября 2008

Я знаю, что я ищу, вероятно, дыру в безопасности, но, поскольку мне удалось сделать это в Oracle и SQL Server, я сделаю это:

Я ищу способ выполнить команду оболочки из сценария SQL на MySQL. При необходимости можно создать и использовать новую хранимую процедуру.

Примечание: я не ищу команду SYSTEM, которую предлагает инструмент командной строки mysql. Вместо этого я ищу что-то вроде этого:

НАЧАТЬ, ЕСЛИ COND1 ... EXEC_OS cmd1; ELSE EXEC_OS cmd2; END;

где EXEC_OS - метод для вызова моего кода.

Ответы [ 4 ]

1 голос
/ 28 января 2010

Это не столько ответ на вопрос, сколько оправдание такого рода функциональности - следовательно, отрицание тех, кто сказал бы: «Вы должны сделать что-то другое» или «почему вы хотите».

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

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

Теперь я понимаю, что UDF могут предоставить решение, но это похоже на большую работу C / C ++ по простому удалению файла. Конечно, сами разрешения базы данных обеспечат как минимум некоторую защиту от потенциальных злоумышленников.

Теперь я понимаю, что мог бы написать сценарий оболочки или что-то подобное, что могло бы удалить запись таблицы, а затем пойти и удалить связанный файл, но, опять же, это вне домена базы данных сама, Как однажды сказал мне старый инструктор, «правила бизнеса должны быть отражены в правилах базы данных». Как ясно видно, я не могу применить это на MySQL.

1 голос
/ 14 ноября 2008
1 голос
/ 19 ноября 2008

Возможно, вы захотите написать свои сценарии на более функциональном языке сценариев, таком как Perl, Python, PHP или Ruby. Все эти языки имеют библиотеки для запуска запросов SQL.

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

START TRANSACTION;
CALL MyProcedure();
ROLLBACK;

Если MyProcedure сделал что-либо, например, создать или отредактировать файл, отправить электронное письмо и т. Д., Эти операции не будут отменены.

Я бы порекомендовал выполнить работу SQL в хранимой процедуре и выполнить другую работу в приложении, которое вызывает хранимую процедуру.

0 голосов
/ 14 ноября 2008

Согласно этому сообщению на forums.mysql.com, решение заключается в использовании MySQL_Proxy .

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