2011-05-12 93 views
5

是否可以在存儲過程中使用動態生成的SQL在MySQL中創建觸發器?我被準備語句執行我的程序等動態構造查詢,但是當我嘗試同樣的方法來創建觸發器我得到以下錯誤:可以使用存儲過程中的動態SQL創建MySQL觸發器嗎?

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

Bug #31625, PREPARED STATEMENT syntax does not allow to create TRIGGERS我看其他人一直在抱怨大約自2007年以來一樣。

而從外觀WL#2871: Prepare any SQL它尚未修復。

是否有解決此問題的方法?有動態SQL創建觸發器的另一種方法嗎?

基本上我正在嘗試做的是動態創建觸發器,以便爲各種不同的表上的插入記錄審計數據。我在* audit_tables *表中列出了我想要審計的表。下面的精簡過程遍歷該表中的條目並嘗試創建觸發器。

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

我正在問同樣的問題。我甚至試圖直接將觸發器數據插入到information_schema.triggers表中,但是root帳戶都沒有權利這麼做。由於我必須創建大量觸發器,因此手動完成這項操作非常煩人。 – vulkanino 2011-05-17 13:08:18

回答

3

由於您提到的錯誤說明CREATE TRIGGER命令在預準備語句中不受支持。

我認爲更可行的選擇是使用具有MySQL綁定(如PHP)的腳本語言來自動創建觸發器。順便說一下,我只記得MySQL Workbench使用Lua作爲這類事情的腳本語言。

相關問題