2011-05-12 4 views
5

È possibile creare un trigger in MySQL utilizzando SQL generato dinamicamente da una stored procedure? Sto eseguendo altre query costruite dinamicamente nel mio procedimento per la preparazione di una dichiarazione, ma quando provo lo stesso approccio per creare un trigger ottengo il seguente errore:I trigger MySQL possono essere creati con SQL dinamico da una stored procedure?

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

Da Bug #31625, PREPARED STATEMENT syntax does not allow to create TRIGGERS vedo altre persone si sono lamentate circa la stessa cosa dal 2007.

E dallo sguardo di WL#2871: Prepare any SQL non è ancora stato risolto.

C'è una soluzione per questo problema? C'è un altro modo di creare trigger con SQL dinamico?

Fondamentalmente quello che sto cercando di fare è creare dinamicamente trigger per la registrazione dei dati di controllo per inserti su vari tavoli diversi. Sto elencando le tabelle che voglio verificare in una tabella * audit_tables *. La procedura ridotta sotto itera sopra le voci in quella tabella e tenta di creare il trigger.

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

Stavo per fare la stessa domanda. Ho persino provato a inserire direttamente i dati del trigger nella tabella information_schema.triggers, ma nessuno dei due account ha i diritti per farlo. Dato che devo creare molti trigger, è abbastanza fastidioso farlo manualmente. – vulkanino

risposta

3

Come l'errore si parla, dice, il comando CREATE TRIGGER non è supportato all'interno di istruzioni preparate.

Credo che una soluzione più praticabile è quella di utilizzare un linguaggio di scripting che ha attacchi di MySQL, come PHP, per automatizzare la creazione di attivazione. A proposito, ho appena ricordato che MySQL Workbench usa Lua come linguaggio di scripting per questo genere di cose.