2012-09-26 77 views
0

我想在調用過程時創建動態觸發器,它給出了mysql服務器版本語法錯誤,當我選擇該查詢並在單獨的查詢編輯器中執行時,它將被執行。在存儲過程中創建Mysql動態觸發器

DROP TABLE IF EXISTS auditLog; 
CREATE TABLE `auditlog` (
    `tableName` VARCHAR(255) DEFAULT NULL, 
    `rowPK` INT(11) DEFAULT NULL, 
    `fieldName` VARCHAR(255) DEFAULT NULL, 
    `old_value` VARCHAR(255) DEFAULT NULL, 
    `new_value` VARCHAR(255) DEFAULT NULL, 
    `ts` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 
) ENGINE=ARCHIVE; 

CREATE TABLE country(countryname VARCHAR(100); 

DROP PROCEDURE IF EXISTS addLogTrigger; 
DELIMITER $ 
/* 
call addLogTrigger('country','CountryID','CountryName') 

*/ 
CREATE PROCEDURE addLogTrigger 
(IN tableName VARCHAR(255), IN pkField VARCHAR(255),IN column_name VARCHAR(50)) 
BEGIN 


    SET @qry = CONCAT 
    (
' 
DROP TRIGGER IF EXISTS ', tableName, '_AU ; 

CREATE TRIGGER ', tableName, '_AU AFTER UPDATE ON ', tableName, ' 
FOR EACH ROW 
       ',' 
       INSERT INTO auditLog (', 
        'tableName, ', 
        'rowPK, ', 
        'fieldName, ', 
        'old_value, ', 
        'new_value' 
        ') VALUES 
        (''', 
         tablename, ''', NEW.', 
         pkField, ', ''', 
         column_name, ''', OLD.', 
         column_name, ', NEW.', 
         column_name, 
        '); 
        ' 
      , ' 

      ' 
     ) ; 

     SELECT @qry; 
     PREPARE stmt FROM @qry; 
      EXECUTE stmt; 
     DEALLOCATE PREPARE stmt; 

END$ 
DELIMITER ; 

回答

2

卡菲基恩,

您不能創建存儲過程中的觸發器。 觸發器是程序內部不允許的DDL語句。

「ERROR 1303(2F003):無法從另一個存儲程序中創建觸發器」

爲了解決你的目的,你可以做以下操作:

  • 從表內搭可變電流值。

  • 只需在您的過程中寫入更新查詢,然後通過「ROW_COUNT()」檢查值是否已更新。

  • 將新值與舊值進行比較,然後手動插入到change_log表中。