Копирование содержимого таблицы MySQL в таблицу в другой (локальной) базе данных
У меня есть две базы данных MySQL для моего сайта - одна для производственной среды, а другая, гораздо меньшая, для среды тестирования / разработки. Оба имеют идентичные схемы (кроме случаев, когда я тестирую что-то, что я намерен изменить, конечно). Небольшое количество таблиц для целей интернационализации:
TransLanguage - неанглийские языки
TransModule - модули (пакеты фраз для перевода, которые могут быть загружены индивидуально PHP-скриптами)
TransPhrase - отдельные фразы на английском языке для возможного перевода
TranslatedPhrase - переводы фраз, представленных добровольцами
ChosenTranslatedPhrase - экранированные переводы фраз.
Все добровольцы, которые занимаются переводом, работают на производственной площадке, так как являются постоянными пользователями.
Я хотел создать хранимую процедуру, которая могла бы использоваться для синхронизации содержимого четырех из этих таблиц - TransLanguage, TransModule, TransPhrase и ChosenTranslatedPhrase - из рабочей базы данных в базу данных тестирования, чтобы поддерживать среду тестирования в актуальном состоянии. и не допустить появления ошибок "неизвестной фразы" во время тестирования. Первым делом я попытался создать следующую процедуру в тестовой базе данных:
CREATE PROCEDURE `SynchroniseTranslations` ()
LANGUAGE SQL
NOT DETERMINISTIC
MODIFIES SQL DATA
SQL SECURITY DEFINER
BEGIN
DELETE FROM `TransLanguage`;
DELETE FROM `TransModule`;
INSERT INTO `TransLanguage` SELECT * FROM `PRODUCTION_DB`.`TransLanguage`;
INSERT INTO `TransModule` SELECT * FROM `PRODUCTION_DB`.`TransModule`;
INSERT INTO `TransPhrase` SELECT * FROM `PRODUCTION_DB`.`TransPhrase`;
INSERT INTO `ChosenTranslatedPhrase` SELECT * FROM `PRODUCTION_DB`.`ChosenTranslatedPhrase`;
END
Когда я пытаюсь запустить это, я получаю сообщение об ошибке: "SELECT command denied to user 'username'@'localhost' for table 'TransLanguage'"
, Я также попытался создать процедуру, которая будет работать наоборот (то есть существовать как часть словаря данных для производственной базы данных, а не тестовой базы данных). Если я делаю это таким образом, я получаю идентичное сообщение, за исключением того, что оно говорит мне, что мне отказано в команде DELETE, а не в SELECT.
Я удостоверился, что у моего пользователя есть привилегии INSERT, DELETE, SELECT, UPDATE и CREATE ROUTINE для обеих баз данных. Тем не менее, похоже, что MySQL не хочет позволить этому пользователю одновременно использовать свои права на обе базы данных. Как получилось, и есть ли способ обойти это?
1 ответ
Ответ на этот вопрос предельно прост, непропорционально тому, сколько времени я потратил на его написание. Моя проблема была просто чувствительностью к регистру. Правильно, я прописал названия баз данных там, где мне не следовало бы. Сообщения об ошибках MySQL, утверждающие, что мне было отказано в разрешении выполнять команды, которые я дал, а не сообщали мне, что базы данных, к которым я пытался получить доступ, не существовали, вводили меня в заблуждение относительно природы проблемы. Я оставляю вопрос в том случае, если он кому-то где-то поучителен.