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
设置时默认使用?
该文档清楚地描述了 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)