[tips]登录后自动更改会话级别参数

需求是:当需要根据连接到数据库的不同用户设置不同的执行环境是,用一张配置表和一个数据库触发器来实现.
  1 把想要设置的参数以及对应用户设置到配置表中
  2 采用触发器当用户登录的时候更改session级别设置

Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0
Connected as scott
 
SQL> DROP TABLE exec_env_conf PURGE;
 
Table dropped
 
SQL>
SQL> CREATE TABLE exec_env_conf(
  2   username VARCHAR2(30),
  3   parameter VARCHAR2(80),
  4   VALUE VARCHAR2(512)
  5  );
 
Table created
 
SQL>  SELECT name,VALUE FROM V$PARAMETER S WHERE S.NAME='optimizer_mode';
 
NAME                                                                             VALUE
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
optimizer_mode                                                                   ALL_ROWS
 
SQL> insert into exec_env_conf values('SCOTT','optimizer_mode','first_rows_10');
 
1 row inserted
 
SQL> commit;
 
Commit complete
 
SQL>
SQL> CREATE or REPLACE TRIGGER execution_environment AFTER logon on DATABASE
  2  BEGIN
  3     FOR c IN (SELECT parameter,VALUE FROM exec_env_conf
  4               WHERE username = sys_context('userenv','session_user'))LOOP
  5        EXECUTE IMMEDIATE 'ALTER SESSION SET '||C.PARAMETER||'='||C.VALUE;
  6 
  7     END LOOP;
  8  END;
  9  /
 
Trigger created
 
SQL>  SELECT name,VALUE FROM V$PARAMETER S WHERE S.NAME='optimizer_mode';
 
NAME                                                                             VALUE
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
optimizer_mode                                                                   ALL_ROWS
 
SQL> conn scott/oracle@test_orcl
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0
Connected as scott
 
SQL>  SELECT name,VALUE FROM V$PARAMETER S WHERE S.NAME='optimizer_mode';
SQL>
 
NAME                                                                             VALUE
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
optimizer_mode                                                                   FIRST_ROWS_10
 
 
其中 sys_context(‘userenv’,‘namespace’) 函数是oracle内部函数根据不同的namespace可以显示出不同的结果值
select
SYS_CONTEXT('USERENV','TERMINAL') terminal,
SYS_CONTEXT('USERENV','LANGUAGE') language,
SYS_CONTEXT('USERENV','SESSIONID') sessionid,
SYS_CONTEXT('USERENV','INSTANCE') instance,
SYS_CONTEXT('USERENV','ENTRYID') entryid,
SYS_CONTEXT('USERENV','ISDBA') isdba,
SYS_CONTEXT('USERENV','NLS_TERRITORY') nls_territory,
SYS_CONTEXT('USERENV','NLS_CURRENCY') nls_currency,
SYS_CONTEXT('USERENV','NLS_CALENDAR') nls_calendar,
SYS_CONTEXT('USERENV','NLS_DATE_FORMAT') nls_date_format,
SYS_CONTEXT('USERENV','NLS_DATE_LANGUAGE') nls_date_language,
SYS_CONTEXT('USERENV','NLS_SORT') nls_sort,
SYS_CONTEXT('USERENV','CURRENT_USER') current_user,
SYS_CONTEXT('USERENV','CURRENT_USERID') current_userid,
SYS_CONTEXT('USERENV','SESSION_USER') session_user,
SYS_CONTEXT('USERENV','SESSION_USERID') session_userid,
SYS_CONTEXT('USERENV','PROXY_USER') proxy_user,
SYS_CONTEXT('USERENV','PROXY_USERID') proxy_userid,
SYS_CONTEXT('USERENV','DB_DOMAIN') db_domain,
SYS_CONTEXT('USERENV','DB_NAME') db_name,
SYS_CONTEXT('USERENV','HOST') host,
SYS_CONTEXT('USERENV','OS_USER') os_user,
SYS_CONTEXT('USERENV','EXTERNAL_NAME') external_name,
SYS_CONTEXT('USERENV','IP_ADDRESS') ip_address,
SYS_CONTEXT('USERENV','NETWORK_PROTOCOL') network_protocol,
SYS_CONTEXT('USERENV','BG_JOB_ID') bg_job_id,
SYS_CONTEXT('USERENV','FG_JOB_ID') fg_job_id,
SYS_CONTEXT('USERENV','AUTHENTICATION_TYPE') authentication_type,
SYS_CONTEXT('USERENV','AUTHENTICATION_DATA') authentication_data
from dual

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/184303/viewspace-700749/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/184303/viewspace-700749/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值