2016-10-05 7 views
1

У меня есть стол и соответствующий вид.Как предотвратить изменение столбца таблицы, если существует представление с этим столбцом?

CREATE TABLE IF NOT EXISTS `test` (
    `id` mediumint(8) unsigned NOT NULL, 
    `test` tinyint(3) unsigned NOT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 
INSERT INTO `test` (`id`, `test`) VALUES (DEFAULT, 1); 
INSERT INTO `test` (`id`, `test`) VALUES (DEFAULT, 2); 

CREATE OR REPLACE 
    ALGORITHM=UNDEFINED SQL SECURITY INVOKER 
VIEW `test_view` AS 
    SELECT `id`, `test` from `test`; 

Я могу изменить структуру таблицы, например:

ALTER TABLE `test` CHANGE `test` `test_renamed` TINYINT(3) UNSIGNED NOT NULL; 

И все последующие запросы для просмотра будет нарушено:

SELECT * FROM test_view; 
#1356 - View 'test_view' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them 

Как предотвратить столбцы таблицы меняющихся если вид используется их ?

UPDATE: У меня есть Percona сервер 5.6.32-78.0

ответ

1

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

Вы можете протестировать в коде код для использования таблицы или даже столбца в любом представлении, записав запрос в таблице information_schema.views. Тем не менее, вам и вашим пользователям выполнить тест, mysql не будет применять его.

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

Затем вы можете переименовать новое имя столбца в имя старого столбца или все, что хотите сделать, чтобы ваши старые просмотры могли использоваться.

+0

<"Я обычно использую скрипт, содержащий все виды, чтобы воссоздать их после изменения структуры базы данных." > Хм, это звучит интересно. Возможно, я могу разделить рабочий процесс миграции и сохранить миграции просмотров отдельно от общих миграций. И выполняйте их каждый раз, когда выполняется одна из общей миграции или после полного процесса миграции. – kivagant

 Смежные вопросы

  • Нет связанных вопросов^_^