在存储过程中创建Mysql动态触发器

时间:2012-09-26 12:44:49

标签: 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 ;

1 个答案:

答案 0 :(得分:2)

卡菲基恩,

您无法在存储过程中创建触发器。 触发器是一个DDL语句,在程序中是不允许的。

“ERROR 1303(2F003):无法在另一个存储例程中创建TRIGGER”

为了解决您的目的,您可以执行以下操作:

  • 从变量中的表中获取当前值。

  • 只需在程序中写入更新查询,然后通过“ROW_COUNT()”检查值是否更新。

  • 将新值与旧值进行比较,将其更改,然后手动插入到change_log表中。