Способ прервать выполнение сценариев MySQL (возможно, возникновение ошибки)? - PullRequest
20 голосов
/ 21 апреля 2009

Мне нужно написать сценарии установки для MySQL (обычно запускаемые с использованием 'source [file]' из консоли mysql), которые частично зависят от существующих данных, и существуют различия в средах, что означает, что иногда сценарий не выполняется. Распространенным случаем является то, что инструкция SET с выбором (для определения идентификатора) не может ничего найти; консоль устанавливает значение NULL. В этом случае я бы хотел, чтобы скрипт не работал; Я слышал, что это будет сделано путем поднятия ошибки (с другими БД). Однако, похоже, что MySQL не мог сделать это.

Есть ли хорошие способы форсировать неудачу в таких условиях? Поскольку сейчас все в порядке, обновления не будут выполнены, когда insert попытается использовать null, но даже это не завершает сам скрипт. В идеале он просто потерпит неудачу и прекратит работу, как только возникнет проблема.

Ответы [ 7 ]

14 голосов
/ 14 августа 2009

У меня была такая же проблема, и графический интерфейс не подходит для меня. Вот как я это решил:

    DELIMITER $$

    DROP FUNCTION IF EXISTS sfKillConnection $$

    CREATE FUNCTION sfKillConnection() RETURNS INT
    BEGIN

        SELECT connection_id() into @connectionId;
        KILL @connectionId;
        RETURN @connectionId;
    END $$


    DELIMITER ;

Это функция, а не процедура, поэтому ее можно вызывать в сценарии следующим образом:

select if(@error, sfKillConnection(), 0);

Возможно, вам потребуется запустить клиент mysql с параметром --disable-reconnect.

8 голосов
/ 26 апреля 2009

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

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

MySQL Administrator делает то, что вам нужно, если я правильно понимаю вашу проблему. Если вы установили свое соединение MySQL и подключились к базе данных, у вас есть два инструмента, доступных в меню Сервис. Там есть обычная консоль MySQL, но у вас также есть MySQL Query Browser.

Если вы откроете Query Browser, вы получите приличный графический интерфейс ваших баз данных MySQL. Файл -> Открыть скрипт, чтобы открыть скрипт SQL, затем нажмите кнопку Выполнить.

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

Я почти сразу же отказался от консоли MySQL, когда узнал и попробовал «Администратор».

6 голосов
/ 29 марта 2012

MySQL Workbench теперь заменяет MySQL Administrator.

Использовать 'Toggle, должно ли выполнение сценария SQL продолжаться после неудачных операторов'

Toggle whether execution of SQL script should continue after failed statements

2 голосов
/ 16 сентября 2009

Вот способ выполнить команды обновления, только если установлена ​​определенная версия.

Это ужасно, но это все, что я могу предложить для mysql 5.

DELIMITER $$  
DROP FUNCTION IF EXISTS `Upgrade_Build`$$    
CREATE FUNCTION `Upgrade_Build`(bversion INT) RETURNS varchar(30)
BEGIN 
  IF bversion = (SELECT MIN(`db_version`) FROM `system`) THEN 
    UPDATE `pages`
      SET `component_parameters` =
        REPLACE(`component_parameters`,'folderviewer_','folder_viewer.'); 
    UPDATE `system`
      SET `db_version` = bversion+1;
    return CONCAT('Success: ',bversion,' > ',bversion+1); 
  ELSE 
    return CONCAT('Failed - Version is ',(SELECT MIN(`db_version`) FROM `system`)); 
  END IF; 
END$$
DELIMITER ;

Чтобы использовать это, сделайте это:

SELECT Upgrade_Build(1327);

Вы увидите нечто подобное, если текущая версия WAS 1327:

Успех: 1327> 1328

Запустите его во второй раз, и вы увидите:

Ошибка - Версия 1328

Надеюсь, это кому-нибудь пригодится.

2 голосов
/ 24 апреля 2009

Похоже, KILL QUERY должен делать то, что вам нужно.

0 голосов
/ 27 марта 2019

Для всех, кто еще ищет, вы можете попросить MySQL завершить соединение, даже текущее:

kill connection_id();
0 голосов
/ 20 ноября 2009

Вот подход с низким лбом:

Мне нужно было убедиться, что @search_admin_realname соответствует записи в таблице profiles; если нет, я хотел прервать свой сценарий.

Итак, я сделал это:

select @search_admin_id:= userid
from profiles
where realname=@search_admin_realname
;
# test that @search_admin_id is not null; 
# if it is, then the insert will fail and script will abort.
create temporary table t_search_admin_id ( search_admin_id mediumint( 9 ) not null );
insert into t_search_admin_id ( search_admin_id ) values ( @search_admin_id );

Единственный недостаток - я не могу настроить сообщение об ошибке: (

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