同じサーバー上の異なるデータベースに異なるタイムゾーンを作成する方法

親愛なるKhabravchians、私はあなたにいくつかの興味深い、一見して明らかでない問題に対する技術的解決策を共有することにしました。 私は基本的に情報をすくい上げただけで、特定の技術的な問題を解決するのに大いに役立つ素晴らしい記事(Habréを含む)を読みました。 しかし、過去2年間で、エンタープライズオートメーション用の独自のクラウドプラットフォームの開発を開始してから、「初めて」という非常に多くのタスクを解決する必要がありました。 誰かが決定した場合、私は説明を見つけませんでした(近くでも)。 この点で、データベースのサイクル、セキュリティのサイクル、自動化システムのサイクルの3つのシリーズの記事を書くことにしました。 この記事は、最初のサイクルの最初の記事です。



問題の簡単な説明 :どういうわけか、current_date、current_time、current_timestampは、ユーザーアカウントの設定に応じて日付時刻を提供する必要があり、モスクワ時間はサーバー自体になります。



システムは無限にスケーラブルで、広大な国のどの地域にも膨大な数の潜在的なユーザーがいると考えられていました。ある時点で、たとえばウラジオストクのユーザーがモスクワ時間のシステムで作業するのが便利かどうかという疑問が生じました。 サーバーはモスクワにあり、モスクワ時間を持ち、各ユーザーは(出身地域に関係なく)複数の(個別の)データベースを持ち、それらはすべて大まかに言って同じサーバー上にあります。 時間帯ごとにサーバーを作成するのは愚かであり、システムコンセプトの観点からは不可能です。ユーザーはいつでも時間帯を変更できるからです。



現在使用されているデータベースのタイプはfirebird 3です



マニュアルを投げて勉強した後、次の簡単な解決策が見つかりました。 3つのシンプルなビューが作成されました。



CREATE OR ALTER VIEW D_CURRENT_DATE(DD) AS SELECT cast((current_timestamp+0.000000000000000)as date) as dd FROM RDB$DATABASE; CREATE OR ALTER VIEW D_CURRENT_TIME(DD) AS SELECT cast((current_timestamp+0.000000000000000)as time) as dd FROM RDB$DATABASE; CREATE OR ALTER VIEW D_CURRENT_TIMESTAMP(DD) AS SELECT (current_timestamp+0.000000000000000) as dd FROM RDB$DATABASE;
      
      





上記のVIEW-モスクワ時間(デフォルト)。 ユーザーがモスクワ以外のタイムゾーン、たとえば「UTC + 7クラスノヤルスク時間」を選択すると、phpスクリプト(ユーザーがこれを選択する)は、データベースのVIEWを次のように変更します。



 CREATE OR ALTER VIEW D_CURRENT_DATE(DD) AS SELECT cast((current_timestamp+0.166666666666667)as date) as dd FROM RDB$DATABASE; CREATE OR ALTER VIEW D_CURRENT_TIME(DD) AS SELECT cast((current_timestamp+0.166666666666667)as time) as dd FROM RDB$DATABASE; CREATE OR ALTER VIEW D_CURRENT_TIMESTAMP(DD) AS SELECT (current_timestamp+0.166666666666667) as dd FROM RDB$DATABASE;
      
      





したがって、ベースのcurrent_timestampから、ユーザーが選択したタイムゾーンに応じて、時間数が加算(または減算)されます。



さらに、すべてのスクリプト、プロシージャ、トリガーのコードでは、current_timestampの代わりにd_current_timestampが常に書き込まれます。 このため、すべてのデータベースがモスクワ時間と同じサーバー上にあるにもかかわらず、モスクワ時間ではなくユーザーの時間がデータベースのすべてのレコードに常に記録されます。



All Articles