2014-12-19 1 views
5

схемы и данные для тестовой базы данных - https://gist.github.com/koceg/435c0d2b1246a69d048fКак обновить таблицу из триггера, когда имя столбца является динамическим?

Моя цель состоит в том, чтобы обновить доски таблицы, когда кто-то вставляет новую строку в objects_properties таблицы. Имя столбца для обновления является динамическим - это зависит от property_id от objects_properties.

До сих пор я создал триггер и хранимую процедуру, но я получаю эту ошибку:

Dynamic sql is not allowed in stored function or trigger.

я делаю что-то неправильно или MySQL не позволяет вызвать хранимую процедуру с подготовленной утверждение внутри триггера? Если да, то как я могу делать то, что хочу?

У меня есть идея, но она уродлива даже в псевдокоде. Реальный SQL будет еще хуже, потому что будет несколько десятков кодов:

SWITCH (property_code) 
    CASE 'name' 
     INSERT INTO boards (id, name) VALUES (@object_id, @value) ON DUPLICATE KEY UPDATE name = @value; 

    CASE 'address' 
     INSERT INTO boards (id, address) VALUES (@object_id, @value) ON DUPLICATE KEY UPDATE address = @value; 

    CASE 'district' 
     INSERT INTO boards (id, district) VALUES (@object_id, @value) ON DUPLICATE KEY UPDATE district = @value; 

P.S. Я не могу переместить эту логику в свое приложение, потому что эта база данных используется несколькими приложениями.

+0

Это плохо спроектированная схема, но я ничего не могу с этим поделать ... –

+0

Согласно документации MySQL: [D.1 Ограничения на сохраненные программы] (http://dev.mysql.com/doc/refman /5.6/en/stored-program-restrictions.html): «SQL подготовленные заявления ([PREPARE]» (http://dev.mysql.com/doc/refman/5.6/en/prepare.html), [EXECUTE] (http://dev.mysql.com/doc/refman/5.6/en/execute.html), [DEALLOCATE PREPARE] (http://dev.mysql.com/doc/refman/5.6/en/deallocate-prepare. html)) можно использовать в хранимых процедурах, но не в хранимых функциях или триггерах. Таким образом, хранимые функции и триггеры не могут использовать динамический SQL (где вы строите операторы как строки и затем выполняете их). ". – wchiquito

+0

Некоторые параметры. Не используйте триггеры для использования Подготовленных утверждений или используйте триггеры без использования подготовленных выражений. – wchiquito

ответ

2

Текущий MySQL (5,7) Ручной раздел D.1 Ограничения на сохраняемых программ заявляет, что

  1. SQL подготовленных операторов (приготовьтесь, EXECUTE, DEALLOCATE ГОТОВИТЬ) могут быть использованы в хранимых процедурах, но не сохраняются функции или триггеры. Таким образом, хранимые функции и триггеры не могут использовать динамический SQL (где вы строите операторы как строки, а затем выполняете их).
  2. Как правило, утверждения, не разрешенные в подготовленных SQL-отчетах, также не разрешены в сохраненных программах. Список утверждений, поддерживаемых в качестве подготовленных операторов.
  3. Поскольку локальные переменные находятся в области видимости только во время сохраненного выполнения программы, ссылки на них не разрешены в подготовленных операциях, созданных в сохраненной программе. Подготовленная область отчета - это текущий сеанс, а не сохраненная программа, поэтому оператор может быть выполнен после завершения программы, после чего переменные больше не будут в области видимости. Итак, вы можете видеть, что это запрещено.

С уважением.

Смежные вопросы