停止 init.ora 中的 NLS 設置被環境變數覆蓋
我們有一個用於開發的數據庫伺服器,它有數百個用於我們應用程序的不同分支/建構的數據庫實例。我們需要一個特殊的實例
NLS_CALENDAR='Thai Buddha'
來測試一個特定的錯誤。我們已經建立了一個數據庫並將
NLS_CALENDAR='Thai Buddha'
設置包含在init.ora
. 但是,我們仍然得到'GREGORIAN'
forNLS_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