私のサイトには 2 つの MySQL データベースがあります。1 つは本番環境用で、もう 1 つはテスト/開発環境用です。どちらも同一のスキーマを持っています (もちろん、変更しようとしているものをテストしている場合を除きます)。少数のテーブルは国際化を目的としています。
TransLanguage - 英語以外の言語
TransModule - モジュール (PHP スクリプトによって個別にロードできる、翻訳用のフレーズのバンドル)
TransPhrase - 潜在的な翻訳用の英語の個々のフレーズ
TranslatedPhrase - ボランティアによって提出されたフレーズの翻訳
ChosenTranslatedPhrase - 選別されたフレーズの翻訳。
翻訳を行う有志は、常連ユーザーなので、全員が制作現場で働いています。
これらの 4 つのテーブル (TransLanguage、TransModule、TransPhrase、および ChosenTranslatedPhrase) の内容を本番データベースからテスト データベースに同期するために使用できるストアド プロシージャを作成して、テスト環境を最新の状態に保ちたいと考えました。テスト中に「不明なフレーズ」エラーが邪魔になるのを防ぎます。私の最初の試みは、test データベースに次のプロシージャを作成することでした。
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'"
。また、逆に機能する手順 (つまり、テスト データベースではなく、運用データベースのデータ ディクショナリの一部として存在する手順) を作成しようとしました。そのようにすると、SELECT ではなく DELETE コマンドが拒否されたことを除いて、同じメッセージが表示されます。
ユーザーが両方のデータベースで INSERT、DELETE、SELECT、UPDATE、および CREATE ROUTINE 権限を持っていることを確認しました。ただし、MySQL は、このユーザーが両方のデータベースで同時に権限を行使できるようにすることに消極的であるようです。これを回避する方法はありますか?