Копирование содержимого таблицы MySQL в таблицу в другой (локальной) базе данных - PullRequest
0 голосов
/ 14 мая 2010

У меня есть две базы данных 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 Ответ

1 голос
/ 14 мая 2010

Ответ на этот вопрос чрезвычайно прост, непропорционально тому, сколько времени я потратил на его написание. Моя проблема была просто вопросом чувствительности к регистру. Правильно, я прописал названия баз данных там, где мне не следовало бы. Сообщения об ошибках MySQL, утверждающие, что мне было отказано в разрешении выполнять команды, которые я дал, а не сообщали мне, что базы данных, к которым я пытался получить доступ, не существовали, вводили меня в заблуждение относительно природы проблемы. Я оставляю вопрос в том случае, если он кому-то где-то поучителен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...