sakila - ¿Cómo abortar la ejecución de los scripts de MySQL(provocando errores quizás)?
mysql workbench (7)
Aquí hay un enfoque de frente baja:
Necesitaba asegurarme de que @search_admin_realname
correspondiera a un registro en la tabla de profiles
; Si no, quise abortar mi guión.
Así que hice esto:
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 );
El único inconveniente es que realmente no puedo personalizar el mensaje de error :(
Necesito escribir scripts de configuración para MySQL (que generalmente se ejecutan usando ''source [file]'' desde mysql console) que dependen en parte de los datos existentes, y hay diferencias en los entornos, lo que significa que a veces los scripts fallan. Un caso común es que una declaración ''SET'' con una selección (para localizar una identificación) no encuentra nada; la consola establece el valor en NULL. En este caso me gustaría que el script falle; He oído que esto se haría generando un error (con otros DB). Sin embargo, parece que MySQL no tenía una manera de hacer esto.
¿Hay buenas maneras de forzar el fracaso en tales condiciones? Como están las cosas, las actualizaciones fallarán cuando la inserción intente usar nulo, pero incluso eso no termina el script en sí. Idealmente, solo fallaría y terminaría tan pronto como se encuentre un problema.
Creo que lo que estás encontrando es una limitación de la consola MySQL. Dada una lista de declaraciones, la consola MySQL ejecuta cada una independientemente de los errores generados. Incluso si implementó algunas de las sugerencias de aumento de errores que los comentarios anteriores han mencionado, la consola MySQL no dejará de ejecutarse cuando se encuentre dicho error.
Asumiré que no tiene los recursos para aplicar un lenguaje de scripting al problema que podría ejecutar su SQL por usted y manejar los errores. Creo que en este caso, solo necesitas una herramienta más robusta que la consola MySQL.
MySQL Administrator hace lo que necesita, si entiendo su problema correctamente. Si configura su conexión MySQL y se conecta a la base de datos, tiene dos herramientas disponibles en el menú Herramientas. La consola MySQL normal está ahí, pero también tiene el buscador de consultas MySQL.
Si abre el navegador de consultas, obtendrá una vista de GUI decente de sus bases de datos MySQL. Archivo -> Abrir script para abrir su script SQL, luego use el botón Ejecutar.
Obtienes una buena barra de progreso y, lo que es más importante, a partir de los sonidos de la misma, si una consulta falla, la ejecución del script detiene y resalta la consulta fallida. Puede elegir omitirlo y continuar, o incluso modificar manualmente sus datos y comenzar desde otro lugar más abajo en el script.
Abandoné la consola de MySQL casi de inmediato una vez que me enteré y probé con Administrator.
Esta es una forma de ejecutar los comandos de actualización solo si una determinada versión está en su lugar.
Es feo, pero es todo lo que puedo sugerir para 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 ;
Para usarlo haz esto:
SELECT Upgrade_Build(1327);
Verás algo como esto si la versión actual fuera 1327:
Éxito: 1327> 1328
Ejecútalo una segunda vez y verás:
Fallido - La versión es 1328
Espero que esto sea de utilidad para alguien.
MySQL Workbench ahora reemplaza a MySQL Administrator.
Use ''Alternar si la ejecución del script SQL debe continuar después de las declaraciones fallidas''
Para cualquier persona que aún esté buscando, puedes pedirle a MySQL que mate una conexión, incluso la actual:
kill connection_id();
Parece que KILL QUERY
debería hacer lo que necesitas.
Tuve el mismo problema y la GUI no es una opción para mí. Así es como lo resolví:
DELIMITER $$
DROP FUNCTION IF EXISTS sfKillConnection $$
CREATE FUNCTION sfKillConnection() RETURNS INT
BEGIN
SELECT connection_id() into @connectionId;
KILL @connectionId;
RETURN @connectionId;
END $$
DELIMITER ;
Es una función en lugar de un procedimiento, por lo que se puede llamar en un script como este:
select if(@error, sfKillConnection(), 0);
Probablemente deba iniciar el cliente mysql con la opción --disable-reconnect
.