У меня есть две базы данных 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 не хочет, чтобы этот пользователь использовал свои привилегии для обеих баз данных одновременно. Как получилось, и есть ли способ обойти это?