2008-12-18 14 views
11

Estoy haciendo una herramienta simple que obtendrá una cadena de comandos MySQL y ejecutarlo (en varios servidores DB secuencialmente). Confío en que los usuarios sean sensatos, pero suceden errores, y estoy buscando una manera de evitar errores tipográficos básicos:¿Cómo comprobar si la consulta MySQL es válida sin ejecutarla?

¿Hay alguna manera de validar, en tiempo de ejecución, (relativamente simples) consultas de MySQL para ver si ' re sintácticamente correcto?

No estoy buscando corrección semántica, p. nombres de tablas o aplicabilidad de unión; algo así como un corrector ortográfico para consultas SQL.

En otras palabras,

SELECT * FROM x; 

o

INSERT INTO x SET id=1,bar="foo"; 

estaría marcada válida, mientras que ninguno de los que no lo haría:

SELECT FROM x; 
SECLET * RFOM x; 
ISNETR INTO x SET id=1; 
HJBGYGCRYTCY; 

Para SELECT s, podía doblar EXPLAIN a mis necesidades - ejecuta EXPLAIN SELECT (...) y busca errores, pero ¿hay algún problema? ¿para verificar otros comandos también?

Respuesta

7

No sin conocimiento del esquema (por ejemplo, ¿es 'x' una tabla?) Y escribiendo un analizador SQL. Su herramienta de consulta de MySQL debería ser capaz de hacer ese tipo de validación (intellisense si lo desea) pero sé por experiencia directa que la mayoría de las herramientas de MySQL (gratuitas) son abismales.

'Preparar' la consulta haría lo que quisiera, pero es una verificación en tiempo de ejecución, no una verificación en tiempo de compilación; parece que busca una solución de tiempo de compilación/fuera de línea.

+0

Estaba buscando una forma rápida de verificar las consultas antes de que el script las ejecute. Escribir un analizador sería demasiado: si se rompe en el primer servidor, simplemente saldrá con un error (supuestamente los usuarios del script (administradores del sistema) están lo suficientemente sanos como para saber lo que están haciendo). – Piskvor

+0

+1 Para prepararse. Esa es la única forma de hacerlo, que yo sepa. – willasaywhat

+0

Parece que MySQL no puede ejecutar PREPARE en un db vacío. Y algunos errores sintácticos no se muestran, por ejemplo, dos campos con el mismo nombre. – powtac

4

Se puede crear una tabla temporal para eludir los efectos secundarios de la consulta:

CREATE TEMPORARY TABLE users SELECT * FROM users; 
INSERT INTO users(name) VALUES('UniqueName'); 
DROP TABLE users; 
SELECT * FROM users WHERE name='UniqueName'; -- Should return 0 results 
6

En función de la configuración del motor y MySQL, se podría iniciar una transacción, trate de la consulta, y luego hacer un rollback. Suponiendo que las lecturas sucias están desactivadas, eso debería funcionar.

+1

Oh wow, acabo de publicar un comentario sobre la respuesta de James Ogden con esta misma idea. Creo que phpMyAdmin y cualquier otro front-end RDMS que permita múltiples consultas deberían encerrarlos automáticamente en una transacción por defecto. –

Cuestiones relacionadas