Блоги@Mail.Ru
новых блогов и сообществ: 16093
новых записей: 66146
  
   Дуэли
         Помощь
добавить запись мои записи мои метки new мои дуэли избранное обо мне настройки оформление  
читать всех друзей редактировать друзей редактировать группы дни рождения настройка подписки  
создать сообщество мои сообщества каталог сообществ  
комментируемые активные популярные читаемые звездные блогиЗвездные блоги на Mail.Ru популярные записи последние записи опросы  
мои дуэли победы поражения прямой эфир двустволка new в десятку! new  
Имя    ( регистрация )
Пароль ( забыли?)

Поиск по блогу

  
14-03-2009 15:29 (ссылка)
  ·  

Хранимые процедуры в MySQL. Часть 1

По долгу службы приходится глубоко разбираться с сабжем.
К сожалению, это не самое лучшее изобретение человечества, поэтому иногда приходится вбивать костыли, чтобы хоть как-то пользоваться этой штукой.


Итак, имеется хранимая процедура, созданная пользователем А.
Мы даем к ней доступ пользователю Б.
GRANT EXECUTE ON PROCEDURE TO <b>;

Пользователь Б может пользоваться этой процедурой.
Все рады, музыка, шампанское.
После фуршета пользователь A вспоминает, что хорошо бы чуток подправить процедуру, чтобы она работала быстрее.И подправляет. Наутро пользователь Б обнаруживает, что больше не может выполнять эту процедуру.
Все в трауре, миллионные потери, разработчики проекта уволены, занавес.

Что же произошло?
Дело в том, что люди из MySQL почему-то не подумали, что необходимость поменять процедуру возникает очень часто. И не сделали возможность изменять код процедуры. ALTER PROCEDURE дает менять какие-то мало вразумительные настройки и не дает менять тела процедуры. Вместо этого ребята из Мускула предлагают делать ей DROP и потом CREATE с новым текстом: «you cannot change the parameters or body of a stored procedure using this statement; to make such changes, you must drop and re-create the procedure». А при удалении процедуры все GRANT'ы на нее, понятное дело, исчезают.

Можно ли было что-то сделать?
Как оказалось, можно.
Текст процедур хранится в таблице proc базы mysql.
И хотя товарищи из Мускула не рекомендуют не лезть в эту таблицу руками, но иного выбора не предоставляют.
В этой таблице нас интересуют два поля — body и body_utf8.
В них содержится текст нашей процедуры.
Берем за хобот нашего DBA и делаем UPDATE на этих полях, занося в них новый текст процедуры.

Казалось бы, время опять устраивать фуршет по поводу успешной борьбы с Мускулом.
Ан нет. Процедура начнет работать по-новому только для новых сессий пользователя Б.
А как быть, если коннекты перманентные и надо сделать изменения доступными и для них?
А вот тут поможет тот самый ALTER PROCREDURE.

Банальное изменения текста комментария к процедуре (например, изменение номера ее ревизии) делает доступными изменения для всех сессий:
ALTER PROCEDURE COMMENT 'r1.1';
 

Метки: alter procedure, mysql 5.1, stored routines, хранимые процедуры, webdev


Комментарии

 

intenter
intenter
14-03-2009 17:26 (ссылка)
 
Re: Хранимые процедуры в MySQL. Часть 1
Да, бубен нужен нехилый.

body и body_utf8 - это технично, конечно :)

 Комментарии запрещены


Байт
Байт
15-03-2009 00:42 (ссылка)
 
Re[2]: Хранимые процедуры в MySQL. Часть 1
Бубны у нас что надо

 Комментарии запрещены


Имя:      



Тема:   
Текст:
 
Классические
:) ;) :-)) ;-P 8-) :-D }:o) $-) :-' :-( 8-( :'( :''() $:-o (:-o 8-0 8-[o] ):-p ):-( ):-$ ):-D :-E :devil: :vampire: :-][ :-| B-j :~o (_I_) :heart: :-* :sleepy:
Жесты
:cool: :viva: :ok: :yol: :yor: :suxx: :think: :figu: :kulak: :fuck:
Анимированные
Ангелочек Аплодисменты Красотка Пиво Читаю Мёрзну Рыдаю Танцую Чертовски злюсь Жую Побью Побили Дарю цветочек Смеюсь Смеюсь и плачу Подарок Ворчу Целую Люблю Застрелю Выпей яду Лучезарно Смущаюсь Расстраиваюсь Пою Скучаю Засыпаю Улыбаюсь Показываю язык Peace! Удивляюсь Тошнит
Продвинутые
Улыбаюсь Злорадствую Радуюсь Старичок Свирепствую Пугаюсь Показываю язык Умник Алкоголик Вояка Удивляюсь Чертовски злюсь Расстраиваюсь Панк Лопну от смеха Подмигиваю Думаю Люблю Подавлен Рыдаю Сейчас расплачусь Злюсь Тошнит Сумасшествие Целую Поцеловали Красотка Ангелочек Подозрительно Жую Смущаюсь Стыдно
    Закрыть