システム日付を変更する方法

システムテスト等で、システム日付を任意に設定したいことはよくあると思う。でも、テストサーバーのOSの日付を変更するのは、なかなか難しいことが多い。ファイルのタイムスタンプがぐちゃぐちゃになって管理上問題になるだけでなく、アプリケーションで問題が起こったり、ミドルウェアで問題が起こることもある。そんな時、RDBMSOracleを使用していて、かつアプリケーションの現在日付にOracle SYSDATEを使用している場合には、SYSDATEを任意に変更する手が使える。(Oracle 10g。他はやったことなし)

システム日付を任意に設定する
http://www.shift-the-oracle.com/debugging-tips/fixed_date.html

ここに記載されているように、

ALTER SYSTEM SET FIXED_DATE = 'YYYY-MM-DD-HH24:MI:SS' SCOPE=MEMORY;

でSYSDATEを変更できる。
戻すときは、*1

ALTER SYSTEM SET FIXED_DATE = none SCOPE=MEMORY;

なお、この方法では、時間がとまってしまうので、任意の日付に設定してかつ時間を進めていきたい場合は、

システム日付を連続的に変更する
http://www.shift-the-oracle.com/debugging-tips/flexible-sysdate.html

にあるようにプロシージャを作成して、無限ループさせながら、連続的に上記SYSDATEの変更SQLを発行すればよい。


ちなみに、Data PumpのようにOracleジョブスケジューラを使用しているものは、SYSDATE変更の影響を受けるみたいなので注意。自分は、SYSDATE固定に設定した上で、expdpしたのに、待てども待てどもエクスポートが始まらなくて焦りました。


*1:参照元サイトには、

ALTER SYSTEM SET FIXED_DATE = none SCOPE=MEMORY;

は危険なので、

ALTER SYSTEM RESET FIXED_DATE SCOPE=SPFILE SID='*';

を使えという記載があるが、Solaris 10でOracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bit(非RAC)で試した限りでは、

ALTER SYSTEM RESET FIXED_DATE SCOPE=SPFILE SID='*';

はエラーになってしまった。SCOPE=MEMORYや、SCOPE=BOTH、SID=にORACLE_SIDを入れるのも試してみたが、どれもエラーになった。仕方なく、

ALTER SYSTEM SET FIXED_DATE = none SCOPE=MEMORY;

を使用しているが、特に問題が発生したことはない。