tldr;
すべてのユーザーが EXECUTE アクセスできる「共有」スキーマを作成し、セッションのタイムゾーンを変更する SPROC を作成し、init_connect MySQL パラメータを変更してそれを呼び出します。
Ryan Weirが重複した質問の優れた回答で指摘したように、これは可能であれば避けるべきです。ただし、あなたが私のようで、利便性と健全性のために実装したい場合は、Ryan のソリューションを使用していくつかの変更を加えました。
複数のユーザーがさまざまな権限で MySQL にセットアップされている場合、単に sproc を mysql スキーマに配置すると問題が発生する可能性があります。これを解決するために、「共有」と呼ばれる新しいスキーマを作成し、すべてのユーザーにこのスキーマへの EXECUTE アクセスを許可しました。次に、次のストアド プロシージャを作成しました。
DROP PROCEDURE IF EXISTS shared.store_time_zone;
CREATE PROCEDURE shared.`store_time_zone`()
IF NOT (POSITION('rdsadmin@' IN CURRENT_USER()) = 1) THEN
SET SESSION time_zone = 'US/Pacific';
END IF;
夏時間を処理するために「US/Pacific」を設定することを好みますが、これをテストして、MySQL インスタンスが最初にそれを認識することを確認する必要があります。次のクエリSET SESSION time_zone = 'US/Pacific';
を実行して、機能することを確認してください。タイムゾーンを調べるには、実行しますSELECT * FROM mysql.time_zone_name;
この時点で、パラメーター グループを変更してすべてを壊す可能性がある前に、アクセス許可をテストすることをお勧めします。単純に DB に接続し (できれば、低レベルの権限を持つユーザーや一般的に使用されているユーザーで)、次のクエリを実行します。
CALL shared.store_time_zone;
select now();
エラーが発生せず、正しい時刻が表示されることを願っています。
次に、RDS インスタンスが使用している DB パラメータ グループの init_connect パラメータを変更する必要があります。これは、API またはコマンドライン ユーティリティを使用して、RDS Web コンソールで実行できます。コマンドラインを使用すると、次のようになります。
$ rds-modify-db-parameter-group PARAMGROUP --parameters "name=init_connect, value='CALL shared.store_time_zone', method=immediate"
Web コンソールから行う場合は、init_connect の値を変更するだけです。
CALL shared.store_time_zone
Web コンソールで RDS インスタンスに戻り、詳細ペインを下にスクロールして DB パラメータ グループを表示します。(applying) や (in-sync) のように表示されます。(同期) になったら、すべてをテストして、問題がないことを確認します。
この時点で問題が発生し、元に戻す必要がある場合は、init_connect の値を次のような無害なものに設定することをお勧めします。
SET SESSION time_zone = '-00:00';
空白に戻すことは、Web コンソールから行うことはできません。DB パラメータの空の値を復元できない理由の詳細については、このスレッドを参照してください。