SQL - problema al crear trigger

 
Vista:
sin imagen de perfil

problema al crear trigger

Publicado por carlos adrian soto (1 intervención) el 08/02/2012 23:25:09
Hola, de antemano mil graicas por su apoyo.

el problema que tengo es que al ejecutar sentencias sql desde java separadas por (; punto y coma ) me lanza una excepción de sintaxis, pero copio las mismas sentencias y las ejecuto directamente en el cliente querryBrouser de mysql y se ejcutan sin ningun problema.

ahora si ejecuto las consultas una a una no hay problema. por ejemplo:
si creo una tabla con el comando execute y luego nuevamente otra con execute desde java todo funciona bien pero si intento armar una cadena con ambas sentencias y ejecutarlas con un solo update, ahi sale el problema.

he echo varias pruebas y he llegado a la conclusion de que el problema lo genera el (;) como sucede en el siguiente trigger por ejemplo que lanza la siguiente exepcion.


String SQL=" ";
SQL="DELIMITER $$ "+
+ "DROP TRIGGER if exists `xData`"+
+"CREATE TRIGGER `a1`.`xData` "+
"+AFTER UPDATE ON `a1`.`tinfo`" +
+ "FOR EACH ROW BEGIN " +
+ "IF (OLD.Name <> NEW.Name) THEN " +
+ "INSERT INTO tlog (remark) VALUES ('EditData'); " +
+ "END IF; " +
+ "END;" +
+ "$$" +
+ "DELIMITER;";
stmt=con.createStatement();
rs=stmt.execute(SQL);

ecepxion
MySQL server version for the right syntax to use near 'DELIMITER $$ CREATE TRIGGER `a1`.`xData` AFTER UPDATE ON `a1`.`tinfo`IF (' at line 1 "

pero al ejecutarlo directamente en mysql se crea sin ningun problema. y lo que sucede es que lo debo crear desde java.
nuevamnte mil gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

problema al crear trigger

Publicado por leonardo_josue (1173 intervenciones) el 09/02/2012 20:00:03
Hola carlos adrian:

Creo que te falta colocar un punto y coma antes del CREATE TRIGGER, es decir, el punto y coma que ejecuta la sentencia DROP:

1
2
+ "DROP TRIGGER if exists `xData`;"+
+"CREATE TRIGGER `a1`.`xData` "+



Sin embargo, me gustaría hacer algunas observaciones con respecto a lo que estás haciendo:

Primero y antes que nada, ¿por qué necesitas ejecutar esta instrucción como un CREATE desde java?, las operaciones que involucran la creación o destrucción de objetos de la BD son responsabilidad del DBA y es recomendable que estos se realicen desde la consola del DBMS y no desde alguna aplicación web o de escritorio. Además, la creación de triggers como es este caso por lo general se realizan una vez, entonces qué caso tendría ponerlo desde una aplicación JAVA? si por el contrario estás pensando en crear y/o destruir varias veces un mismo TRIGGER tienes un verdadero problema de conceptos de BD. Además, para poder permitir que un usuario puede hacer estas operaciones sobre la BD, deberás otorgarle a la cuenta permisos de Administrador o propietario de la BD, lo cual puede comprometer enormemente la seguridad de la misma. Es recomendable que tus aplicaciones web o de escritorio sólo utilicen cuentas de lectura, o en su defecto limitar los privilegios de las mismas, así si cae en manos equivocadas el daño no sea tan grave.

Segundo, mucho ojo en cómo estás formando tus consultas SQL, la forma en que estás concatenando cadenas es la más ineficiente que existe y además puede acarrear problemas como inserción de código SQL malicioso (pregunta a san GOOGLE sobre este problema y como evitarlo). En lugar de esto puedes utilizar un StringBuilder para formar tu consulta.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar