2011-05-12 15 views
5

¿Es posible crear un disparador en MySQL usando SQL generado dinámicamente desde dentro de un procedimiento almacenado? Estoy ejecutando otras consultas dinámicamente construidas en mi procedimiento mediante la preparación de una declaración, pero cuando intento el mismo enfoque para crear un disparador me sale el siguiente error:¿Se pueden crear activadores MySQL con SQL dinámico desde un procedimiento almacenado?

ERROR Code: 1295This command is not supported in the prepared statement protocol yet

De Bug #31625, PREPARED STATEMENT syntax does not allow to create TRIGGERS veo que otras personas se han quejado casi lo mismo desde 2007.

Y por el aspecto de WL#2871: Prepare any SQL aún no se ha solucionado.

¿Existe una solución para este problema? ¿Hay alguna otra forma de crear activadores con SQL dinámico?

Básicamente, lo que intento hacer es crear activadores dinámicos para registrar datos de auditoría para inserciones en varias tablas diferentes. Estoy enumerando las tablas que quiero auditar en una tabla * audit_tables *. El siguiente procedimiento simplificado itera sobre las entradas en esa tabla e intenta crear el desencadenador.

drop procedure if exists curtest; 
delimiter | 
create procedure curtest() 
BEGIN 
    DECLARE done INT DEFAULT 0; 
    declare tn varchar(16); 
    declare cur cursor for select table_name from audit_tables; 
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; 
    OPEN cur; 
    read_loop: LOOP 
     fetch cur into tn; 
     if done then 
      leave read_loop; 
     end if; 

     /* Create the BEFORE INSERT trigger */ 
     set @sql = concat('CREATE TRIGGER audit_', tn, '_bi BEFORE INSERT ON ', tn, ' 
      FOR EACH ROW BEGIN 
       set new.foo="bar"; 
      END;'); 
     PREPARE stmt FROM @sql; 
     EXECUTE stmt; 
     DEALLOCATE PREPARE stmt; 
    end LOOP; 
    close cur; 
END; 
| 
delimiter ; 

call curtest(); 
+0

Estaba a punto de hacer la misma pregunta. Incluso traté de INSERTAR directamente los datos desencadenantes en la tabla information_schema.triggers, pero ninguno de los dos cuenta tiene los derechos para hacerlo. Como tengo que crear muchos disparadores, es bastante molesto hacerlo manualmente. – vulkanino

Respuesta

3

Como el error que mencionas dice, el comando CREATE TRIGGER no se admite dentro de declaraciones preparadas.

Creo que una opción más viable es usar un lenguaje de scripts que tenga enlaces MySQL, como PHP, para automatizar la creación de disparadores. Por cierto, acabo de recordar que MySQL Workbench usa Lua como lenguaje de scripting para este tipo de cosas.

Cuestiones relacionadas