停止 init.ora 中的 NLS 设置被环境变量覆盖

sam*_*ris 1 oracle oracle-11g-r2 parameter

我们有一个用于开发的数据库服务器,它有数百个数据库实例,用于我们应用程序的不同分支/构建。我们需要一个特殊的实例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设置时默认使用?

Bal*_*app 5

该文档清楚地描述了 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
Run Code Online (Sandbox Code Playgroud)

您可以从中选择前两个。登录触发器也可以发出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;
/
Run Code Online (Sandbox Code Playgroud)

检查 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
Run Code Online (Sandbox Code Playgroud)