web-dev-qa-db-ja.com

ログオントリガーでのNLSパラメータの設定がOracle 11gで機能しない

特定のユーザーがログインすると、そのNLSセッションパラメーターが変更されるようにトリガーを設定しています。これは、以前はOracle 10gで機能していました。 Oracle 11g RACに移行しましたが、セッションパラメータは永続化されなくなりました。説明のために、NLS_DATE_FORMATが適切に使用されていないことを示すセッションを貼り付けました。

これが私たちが使用しているトリガーです:

create or replace
TRIGGER schmea.nls_tr
AFTER logon ON DATABASE
BEGIN
   execute immediate 'ALTER SESSION SET NLS_DATE_FORMAT = ''YYYY-MM-DD HH24:MI:SS'' NLS_TIMESTAMP_FORMAT = ''YYYY-MM-DD HH24:MI:SS.FF'' NLS_TERRITORY = ''AMERICA''';
END;

上記のフォーマットはデフォルトではないため、ログイン時に変更されるように見えます。

SQL> select * from nls_session_parameters where parameter = 'NLS_TIMESTAMP_FORMAT' or parameter = 'NLS_DATE_FORMAT'; 

PARAMETER
--------------------------------------------------------------------------------
VALUE
--------------------------------------------------------------------------------
NLS_DATE_FORMAT
YYYY-MM-DD HH24:MI:SS

NLS_TIMESTAMP_FORMAT
YYYY-MM-DD HH24:MI:SS.FF

SQL> select count(*) from TABLE where start_date > '2012-06-10 00:00:00';
select count(*) from TABLE where start_date > '2012-06-10 00:00:00'
*
ERROR at line 1:
ORA-12801: error signaled in parallel query server P024, instance
[domain.com]:[instance] (1)
ORA-01861: literal does not match format string

SQL> alter session set NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS'; 

Session altered.

SQL> select count(*) from TABLE where start_date > '2012-06-10 00:00:00';

  COUNT(*)
----------
      4901

SQL> select * from nls_session_parameters where parameter = 'NLS_TIMESTAMP_FORMAT' or parameter = 'NLS_DATE_FORMAT'; 

PARAMETER
--------------------------------------------------------------------------------
VALUE
--------------------------------------------------------------------------------
NLS_DATE_FORMAT
YYYY-MM-DD HH24:MI:SS

NLS_TIMESTAMP_FORMAT
YYYY-MM-DD HH24:MI:SS.FF

助けてください。髪を13時間7分4秒引き裂きました。何か案は?

ありがとうございました。

3
Josh Smeaton

SETの順序を変更すると、現在機能しているため、違いが生じたようです。

create or replace
TRIGGER schema.Django_nls_tr
AFTER logon ON DATABASE
BEGIN
execute immediate 'ALTER SESSION SET NLS_TERRITORY = ''AMERICA'' NLS_DATE_FORMAT = ''YYYY-MM-DD HH24:MI:SS'' NLS_TIMESTAMP_FORMAT = ''YYYY-MM-DD HH24:MI:SS.FF''';
END;

順序を変更することが重要である理由を正確に理解していないため、このソリューションはあまり好きではありません。 TERRITORYが正しく設定されていない可能性がありますが、すでにデフォルトになっているため、心配する必要はありません。

また、DjangoはTO_TIMESTAMP。ほとんどの日付フィールドはTIMESTAMP(6)であると想定していますが、DATEタイプのフィールドを持つレガシーデータベースを指定しました。標準の展開では、NLSはそれほど劇的に重要ではありません。

2
Josh Smeaton

「My Oracle Support」(MOS)を検索したところ、これは少なくともバージョン11.1.0.6および11.1.0.7で報告されたバグであることがわかりました。バグレポートの1つである#6747927は、11.2で修正されたことを示しているようですが、タグの1つ[Oracle-11g-r2]で判断するとそうでない場合があります。 MOSでチケットを開くことをお勧めします。

1
George3