Можно ли создать триггеры MySQL с помощью динамического SQL из хранимой процедуры?

Можно ли создать триггер в MySQL, используя динамически генерируемый SQL из хранимой процедуры? Я выполняю другие динамически создаваемые запросы в своей процедуре, подготавливая оператор, но когда я пробую тот же подход для создания триггера, я получаю следующую ошибку:

Код ОШИБКИ: 1295: Эта команда еще не поддерживается в протоколе подготовленных операторов

Из Ошибка №31625, синтаксис ПОДГОТОВЛЕННОГО ЗАЯВЛЕНИЯ не позволяет создавать ТРИГГЕРЫ Я вижу, что другие люди жалуются на то же самое с 2007 года. ] И из вида WL # 2871: Подготовьте любой 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();

6
задан Peter Mortensen 1 June 2011 в 05:54
поделиться