Можно ли создавать триггеры MySQL с помощью динамического SQL из хранимой процедуры? - PullRequest
5 голосов
/ 12 мая 2011

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

Код ошибки: 1295Эта команда не поддерживается впротокол подготовленного заявления еще

С Ошибка # 31625, синтаксис PREPARED STATEMENT не позволяет создавать TRIGGERS Я вижу, что другие люди жаловались на то жевещь с 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();

1 Ответ

3 голосов
/ 04 июня 2011

Как сказано в сообщении об ошибке, команда CREATE TRIGGER не поддерживается в подготовленных выражениях.

Я думаю, что более жизнеспособным вариантом является использование языка сценариев с привязками MySQL, таких как PHP, для автоматизации создания триггера. Кстати, я только что вспомнил, что MySQL Workbench использует Lua в качестве языка сценариев для такого рода вещей.

...