2011-11-03

Модификация хранимой процедуры/функции


Если вы используете репликацию, то может случаться что она отваливается когда вы на мастер сервере производите модификации в хранимых процедурах/функциях. Например в Adminer  под функцией с названием "Alter procedure" скрывается выполнение атомарных операций DROP и CREATE и если модифицируемая процедура/функция активно используются в триггерах, то вполне возможна ситуация когда триггер будет вызывать процедуру которой нет, а это в свою очередь повлечёт отключение репликации.


Кроме того DROP может выполниться, а CREATE нет, например если вы забыли указать [NOT] DETERMINISTIC для функции, или просто допустили ошибку в теле процедуры/функции.
В этой ситуации можно избежать проблем, повесив блокировки на таблицы в которых "дёргается" триггер использующий процедуру или можно воспользоваться следующим подходом:

DELIMITER ;;

CREATE PROCEDURE `proc_name_new`(...)
BEGIN
...
END;;

DELIMITER ;

BEGIN
  UPDATE `mysql`.`proc`
  SET name = `proc_name_timestamp`, specific_name = 'proc_name_timestamp'
  WHERE db = 'dbname' AND name = 'proc_name';

  UPDATE `mysql`.`proc`
  SET name = 'proc_name_new', specific_name = 'proc_name'
  WHERE db = 'dbname' AND name = 'proc_name_new';

  UPDATE `mysql`.`procs_priv`
  SET Routine_name = 'proc_name_timestamp'
  WHERE Db = 'dbname' AND Routine_name = 'proc_name';

  UPDATE `mysql`.`procs_priv`
  SET Routine_name = 'proc_name'
  WHERE Db = 'dbname' AND Routine_name = 'proc_name_new';
COMMIT;

FLUSH PRIVILEGES;

Комментариев нет:

"In order to ask a question you must already know most of the answer"
/Robert Sheckley/