Копирование содержимого таблицы 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, утверждающие, что мне было отказано в разрешении выполнять команды, которые я дал, а не сообщали мне, что базы данных, к которым я пытался получить доступ, не существовали, вводили меня в заблуждение относительно природы проблемы. Я оставляю вопрос в том случае, если он кому-то где-то поучителен.

Другие вопросы по тегам