oracle 上下文环境,浅谈oracle中的context(上下文)Oracle Application Context

Application Context是内存中的一组name-value对,application context从属于某个命名空间(namespace)。

用户只能通过一个自定义procedure调用dbms_session.set_context来设置application context的值。用户使用sys_context(,)来获取某个application context的值。

Application context分为三种

dabase session-based application context,又称为local application context。

global application context

client session-based application context。通常被OCI使用,存储在客户端内存,而不是Oracle服务器端,也由OCI程序管理。

Local application context

存储在UGA中,dedicated server mode, UGA在PGA中,shared server mode,UGA在SGA中。local application context是会话/server process级别的。只有本会话能够访问。当会话/server process终止时,local application context的生命周期也结束了。另一篇博客Oracle VPD http://blog.csdn.net/chncaesar/article/details/18550029 给出了一个local application context的例子。

Global application context存储在SGA中,只要SGA不消亡,global application context就一直存在。global application context常常用于跨会话,与会话无关的场景。dbms_session.set_context有两个默认值为NULL的参数:

username

client_id

username = null , client_id=null。所有用户都能访问。

username = null, client_id=。 只要session 的client_id =,而不管username,都能访问。

username = , client_id=null。只要session使用指定的oracle schema登陆,不管client_id,都能访问。

username = , client_id=. 常用于statless web session ,如http。

username = , client_id= . 该username将用于数据库连接池的owner。

例子1: 所有用户都能访问的application context

CREATEORREPLACECONTEXT global_hr_ctx USING hr_ctx_pkg ACCESSED GLOBALLY;

CREATEORREPLACEPACKAGE hr_ctx_pkg

AS

PROCEDUREset_hr_ctx(sec_levelINVARCHAR2);

PROCEDUREclear_hr_context;

END;

/

CREATEORREPLACEPACKAGE BODY hr_ctx_pkg

AS

PROCEDUREset_hr_ctx(sec_levelINVARCHAR2)

AS

BEGIN

DBMS_SESSION.SET_CONTEXT(

 namespace  => 'global_hr_ctx',

attribute  => 'job_role',

value      => sec_level);

ENDset_hr_ctx;

PROCEDUREclear_hr_context

AS

BEGIN

DBMS_SESSION.CLEAR_CONTEXT('global_hr_ctx','job_role');

ENDclear_context;

END;

/

例子2: 跨session/application,但是使用同一个数据库schema的application context。

CREATEORREPLACEPACKAGE hr_ctx_pkg

AS

PROCEDUREset_hr_ctx(sec_levelINVARCHAR2, user_nameINVARCHAR2);

PROCEDUREclear_hr_context;

END;

/

CREATEORREPLACEPACKAGE BODY hr_ctx_pkg

AS

PROCEDUREset_hr_ctx(sec_levelINVARCHAR2, user_nameINVARCHAR2)

AS

BEGIN

DBMS_SESSION.SET_CONTEXT(

namespace  => 'global_hr_ctx',

attribute  => 'job_role',

value      => sec_level,

       username   => user_name);

ENDset_hr_ctx;

PROCEDUREclear_hr_context

AS

BEGIN

DBMS_SESSION.CLEAR_CONTEXT('global_hr_ctx');

ENDclear_context;

END;

/

两个例子都提供了clear_hr_context 存储过程。这是因为global application context常驻SGA,需要用户使用完毕就清理,以免信息泄露。

USERENV

USERENV是Oracle预定义的命名空间。它包含了许多常用的application context。

CURRENT_USER

DB_NAME

HOST: 客户端机器名

CLIENT_INFO: 客户端程序用作计数,标识符等

其他application context请参考SQL Language Reference。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值