Рефакторинг баз данных в dbForge Studio for MySQL, v6.0

devart
Дата: 14.02.2013 20:16:23
Мы рады сообщить вам о выпуске новой версии студии, в которой реализована функциональность рефакторинга баз данных.
Как известно, рефакторинг базы данных является непростой задачей, и каждый разработчик или администратор рано или поздно с ней сталкивается.

В каких случаях можно ожидать проблем при рефакторинге базы данных 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
miksoft
Дата: 14.02.2013 20:29:20
вадя
Дата: 14.02.2013 23:22:11
есть одно неудобство.
построитель-констркутор не хочет работать с временными таблицами.
багом это трудно назвать, да и фичей тоже.
это решается удалением слова TEMPORARY при создании таблицы. и потом вставки его обратно.
и соответственно удалением временной-постоянной таблицы :)

за рефакторинг спасибо, желание поправить базу были - останавливала неизвестность результата.

только последняя 5 версия не сообщает о появлении новой. это так задумано? новая версия только для sql.ru? :)
Hett
Дата: 15.02.2013 08:02:04
Это же бета
Hett
Дата: 15.02.2013 09:55:28
А где-то есть открытый баг трекер или сюда писать?
Вот сейчас нашел такой небольшой баг: если открыть таблицу на просмотр данных и установить сортировку путем клика по заголовку столбца, то при нажатии на F5 сотрировка сбрасывается на дефолтную.
devart
Дата: 15.02.2013 13:36:21
вадя
построитель-констркутор не хочет работать с временными таблицами.
Поддержка временных таблиц не планируется т.к. с ними есть технические сложности.
вадя
за рефакторинг спасибо, желание поправить базу были - останавливала неизвестность результата.
В любом случае, работает приложение правильно или нет, просто необходимо перед любыми изменениями базы данных сделать бекап.
Какой скрипт будет выполнять рефакторинг можно посмотреть, установив чекбокс "Сгенерировать скрипт не изменяя базу данных".
вадя
только последняя 5 версия не сообщает о появлении новой. это так задумано? новая версия только для sql.ru?
Бета ставится параллельно с релизной версией, и у нах разные каналы обновления - бета будет обновляться до следующего билда беты, а релизная версия будет обновлена до следующей релизной версии, при выходе последней.
Hett
А где-то есть открытый баг трекер или сюда писать?
Как Вам проще, можно публично через наш форум, можно индивидуально через тикеты, любый удобным способом.
Hett
Вот сейчас нашел такой небольшой баг: если открыть таблицу на просмотр данных и установить сортировку путем клика по заголовку столбца, то при нажатии на F5 сотрировка сбрасывается на дефолтную.
Мы воспроизвели эту проблему и будем ее исправлять.
вадя
Дата: 16.02.2013 10:14:03
автор
В любом случае, работает приложение правильно или нет, просто необходимо перед любыми изменениями базы данных сделать бекап.



люди делятся на 2 категории:
1 категория - делают бекап
2 категория - будут делать бекап
(не моё)


давно перешёл в 1 категорию
Hett
Дата: 18.02.2013 10:06:14
А где-то можно настроить время ожидания ответа от сервера (TCP/IP, при разрыве соединения чтобы долго не ждал ответа)
Hett
Дата: 18.02.2013 10:06:19
?
Джибс
Дата: 18.02.2013 16:08:26
Случайно закрыл таблицу с данными.

открыл ее назад, выполняю запрос, ничего не появляется.

кликая по данному окну, предлагает выполнить скрипт, но если соглашусь, все равно не показывает результаты.