Важное о наименовании процедур в MySQL!
Из архива
Расскажу об одном небольшом нюансе который поможет сэкономить время и нервы. Эта особенность мною была замечена только в MySQL (проявлялась как в 5 так и пока в тестовом 6-ом). Заключается она в необходимости особого наименования процедур, для правильного восстановления базы из архива (дампа MySQL).
Смысл заключается в алфавитном порядке функций. При создании дампа базы все элементы сохраняются в алфавитном порядке, тоесть если в процедуре proc1 вызвать процедуру proc2 — то при восстановлении из дампа вылетит ошибка поскольку первой будет восстанавливаться процедура proc1 — которой требуется proc2 — но её в базе на момент воссоздания ещё не будет.
Способ борьбы с этим самый простой и самый эффективный, это просто взять за правило, никогда не вызывать функции названия которых ближе к началу алфавита чем у той из которой функция вызывается.
Лично я как правило функции связанные между собой стараюсь просто называть одинаково и нумеровать.
Пример:
CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `view_export1` AS
select
`market_smartdocspec`.`ID_DOCHEAD` AS `ID_DOCHEAD`,
`market_cards`.`ID_CLASSIF` AS `ID_CLASSIF`,
`market_smartdocspec`.`ARTICUL` AS `ARTICUL`,
`market_smartdocspec`.`NAME` AS `NAME`,
sum(`market_smartdocspec`.`QUANTITY`) AS `QUANTITY`,
(sum((`market_smartdocspec`.`PRICE` * `market_smartdocspec`.`QUANTITY`)) / sum(`market_smartdocspec`.`QUANTITY`)) AS `PRICE`,
sum((`market_smartdocspec`.`PRICE` * `market_smartdocspec`.`QUANTITY`)) AS `SUMMA`
from
(`market_smartdocspec` join `market_cards`)
where
(`market_smartdocspec`.`ARTICUL` = `market_cards`.`ARTICUL`)
group by
`market_smartdocspec`.`ID_DOCHEAD`,`market_smartdocspec`.`ARTICUL`;
CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `view_export2` AS
select
`view_export1`.`ID_DOCHEAD` AS `ID_DOCHEAD`,
`view_export1`.`ID_CLASSIF` AS `ID_CLASSIF`,
`market_classif`.`NAME` AS `NAME_CLASSIF`,
`view_export1`.`ARTICUL` AS `ARTICUL`,
`view_export1`.`NAME` AS `NAME`,
`view_export1`.`QUANTITY` AS `QUANTITY`,
`market_ostatok`.`QUANTITY` AS `OSTATOK`,
`view_export1`.`PRICE` AS `PRICE`,
`market_cards`.`PRICE_SELECT` AS `PRICE1`,
`view_export1`.`SUMMA` AS `SUMMA`,
(`market_ostatok`.`QUANTITY` * `market_cards`.`PRICE_SELECT`) AS `SUMMA1`
from
(((`view_export1` join `market_cards`) join `market_classif`) join `market_ostatok`)
where
((`view_export1`.`ARTICUL` = `market_cards`.`ARTICUL`) and (`view_export1`.`ID_CLASSIF` = `market_classif`.`ID`) and (`market_cards`.`ARTICUL` = `market_ostatok`.`IDENT_CARD`))
group by
`view_export1`.`ID_DOCHEAD`,`view_export1`.`ARTICUL`;
Эти представления (VIEW) — восстановятся правильно, но если я поменяю имя view_export1 на z_export1 — то при восстановлении произойдёт ошибка.