Oracle

停止 init.ora 中的 NLS 設置被環境變數覆蓋

  • September 1, 2014

我們有一個用於開發的數據庫伺服器,它有數百個用於我們應用程序的不同分支/建構的數據庫實例。我們需要一個特殊的實例NLS_CALENDAR='Thai Buddha'來測試一個特定的錯誤。

我們已經建立了一個數據庫並將NLS_CALENDAR='Thai Buddha'設置包含在init.ora. 但是,我們仍然得到'GREGORIAN'for NLS_CALENDAR,因為環境變數會覆蓋init.ora.

NLS_CALENDAR值設置如下:

NLS_SESSION_PARAMETERS: 'GREGORIAN'

NLS_INSTANCE_PARAMETERS: 'Thai Buddha'

NLS_DATABASE_PARAMETERS: 'GREGORIAN'

ALTER SESSION不是一個選項,因為那時我們必須修改我們的應用程式碼以ALTER SESSION在使用者登錄時發出(這是不可能的,因為我們已經在不同的機器上部署了多個客戶端)。修改環境設置也不是一種選擇,因為在同一主機上執行著其他數據庫實例。

我試過ALTER SYSTEM了,但它給出了以下oracle錯誤:

ORA-02096: 指定的初始化參數不能用此選項修改

我們如何使單個數據庫實例忽略環境設置?或者有沒有其他方法可以讓我們的實例在設置'Thai Buddha'時預設為預設值NLS_CALENDAR

該文件清楚地描述了 NLS 設置的優先級:http: //docs.oracle.com/cd/E11882_01/server.112/e10729/ch3globenv.htm#NLSPG188

1 (highest) Explicitly set in SQL functions
2           Set by an ALTER SESSION statement
3           Set as an environment variable
4           Specified in the initialization parameter file
5           Default

您可以從這些中選擇前兩個。登錄觸發器也可以發出ALTER SESSION,您無需為此修改應用程式碼:

CREATE OR REPLACE TRIGGER SET_NLSCALENDAR_ONLOGIN AFTER LOGON ON DATABASE
BEGIN
 IF SYS_CONTEXT('USERENV','SESSION_USER') = 'SCOTT' THEN
   EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_CALENDAR=''Thai Buddha''';
 END IF;
END;
/

檢查 SCOTT 和其他使用者的設置:

SQL> connect scott/tiger
Connected.
SQL> select value from nls_session_parameters where parameter = 'NLS_CALENDAR';

VALUE
-----------
Thai Buddha

SQL> select value from nls_database_parameters where parameter = 'NLS_CALENDAR';

VALUE
-----------
GREGORIAN

SQL> conn hr/hr
Connected.
SQL> select value from nls_session_parameters where parameter = 'NLS_CALENDAR';

VALUE
-----------
GREGORIAN

引用自:https://dba.stackexchange.com/questions/75406