0

私のサイトには 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 は、このユーザーが両方のデータベースで同時に権限を行使できるようにすることに消極的であるようです。これを回避する方法はありますか?

4

1 に答える 1

1

この質問への答えは非常に単純で、入力に費やした時間とは比べ物にならないほどです。私の問題は、大文字と小文字の区別の問題にすぎませんでした。そうです、私が持つべきではないデータベースの名前を大文字にしました。MySQL のエラー メッセージは、アクセスしようとしているデータベースが存在しないことを通知するのではなく、発行したコマンドを実行する権限が拒否されたことを示しており、問題の性質について誤解を招きました。どこかで誰かに何らかの形で有益である場合に備えて、質問はそのままにしておきます。

于 2010-05-14T01:08:33.107 に答える