Мы рады сообщить вам о выпуске новой версии студии, в которой реализована функциональность рефакторинга баз данных.
Как известно,
рефакторинг базы данных является непростой задачей, и каждый разработчик или администратор рано или поздно с ней сталкивается.
В каких случаях можно ожидать проблем при рефакторинге базы данных MySQL:
1) При переименовании столбца таблицы, на который ссылается столбец из другой таблицы через внешний ключ;
2) При переименовании столбца таблицы или самой таблицы, из которой происходит выборка в представлении;
3) При переименовании объектов, содержащих код.
Рассмотрим перечисленные проблемы на примерах:
1) Переименование столбца таблицы, на который ссылается столбец из другой таблицы через внешний ключ.Есть две таблицы из
базы sakila:
CREATE TABLE country (
country_id smallint(5) UNSIGNED NOT NULL AUTO_INCREMENT,
country varchar(50) NOT NULL,
last_update timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (country_id)
)
ENGINE = INNODB;
CREATE TABLE city (
city_id smallint(5) UNSIGNED NOT NULL AUTO_INCREMENT,
city varchar(50) NOT NULL,
country_id smallint(5) UNSIGNED NOT NULL,
last_update timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (city_id),
INDEX idx_fk_country_id (country_id),
CONSTRAINT fk_city_country FOREIGN KEY (country_id)
REFERENCES country (country_id) ON DELETE RESTRICT ON UPDATE CASCADE
)
ENGINE = INNODB;
Если обычным способом попытаться переименовать столбец country_id в таблице country, выполнив следующий запрос (который, например, будет сгенерирован практически любым MySQL GUI инструментом):
ALTER TABLE sakila.country
CHANGE COLUMN country_id id SMALLINT(5) UNSIGNED NOT NULL AUTO_INCREMENT;
MySQL выдаст ошибку вида:
| автор |
|---|
| Error on rename of '.\sakila\#sql-62c_c6' to '.\sakila\country' (errno: 150) |
Таким образом, перед переименованием столбца нужно найти все внешние ключи, удалить их, переименовать столбец и заново воссоздать все удаленные ранее внешние ключи:
ALTER TABLE city
DROP FOREIGN KEY fk_city_country;
ALTER TABLE country
CHANGE COLUMN country_id id smallint(5) UNSIGNED NOT NULL AUTO_INCREMENT;
ALTER TABLE city
ADD CONSTRAINT fk_city_country FOREIGN KEY (country_id)
REFERENCES country (id) ON DELETE RESTRICT ON UPDATE CASCADE;
2) Предыдущий случай простой, но в реальной базе sakila, столбец country_id таблицы country еще участвует в выборке созданных представлений (view-шек).MySQL разрешит обычным способом переименовать столбец, но позже, при выборке данных из представления будет возникать ошибка:
| автор |
|---|
| Unknown column 'sakila.country.country_id' in 'on clause' |
Чтобы избежать подобных ситуаций, необходимо после переименования столбца, отредактировать все представления, где участвует переименованный столбец.
3) Более "опасный" способ переименования объектов, в результате неудачи которого, можно было лишиться вообще исходного кода процедуры или функции — если в визуальном редакторе процедуры изменить имя процедуры и одновременно допустить синтаксическую ошибку в теле процедуры.Из-за того, что MySQL не позволяет при помощи ALTER PROCEDURE изменять код процедуры, приходится пересоздать процедуру с изменениями, т.е. сначала удалить созданную процедуру, а затем создать ее с новым именем и измененным кодом.
В случае, если была допущена синтаксическая ошибка, то старая процедура успешно удалится, а новая не создастся (после чего, придется процедуру воссоздавать заново по памяти). Так работает любое приложение, для администрирования MySQL.
dbForge Studio for MySQL, v6.0 делает безопасное переименование объектов, содержащих код:
a) Создается вр
еменная функция (процедура), содержащая исходный код (до переименования);
b) Удаляются все объекты, где эта функция (процедура) вызывается;
c) Создаются все объекты, где эта функция (процедура) вызывается, но с уже переименованным именем;
d) Создается функция (процедура) с новым исходным кодом и с новым именем;
e) Удаляется временная функция (процедура);
Если этап d) заканчивается неудачей, то выполнение скрипта останавливается, и исходный код функции (процедуры) можно будет восстановить из вр
еменного объекта.
Рефакторинг в нашем приложении можно вызвать из контекстного меню каждого объекта в Проводнике базы данных, а также в визуальном редакторе объектов, при изменении имени уже созданного объекта.

В новой версии
функциональность "Рефакторинг" стала
ключевой функциональностью, набравшей максимальное количество голосов пользователей.
По нашим данным, функциональность рефакторинга баз данных не реализована ни в одном из существующих инструментов для администрирования MySQL.
По ходу реализации, нам пришлось полностью переделать функциональность: сравнение схем, бекпа, генерацию скриптов, подсказчик кода и форматтер.
В результате, это повлекло за собой задержку релиза на 2-3 месяца...
Мы благодарим всех пользователей, участвовавших в голосовании за эту функциональность, и как и раньше - ждем ваших отзывов и предложений.
Новую версию можно скачать на странице загрузок.
С уважением,
Команда devart