Kingbase实现Oracle userenv函数功能

目录

1. 问题

2. 文档概述

3. Oracle userenv()函数功能调研

3.1. 函数名称/函数原型

3.2. 函数功能

3.3. 参数介绍

3.3.1. Parameter

3.4. 函数示例

3.4.1. 示例1: 

3.5. 基于Kingbase适配userenv函数功能的实现

3.5.1. 实现userenv(‘parameter’);函数


1. 问题

Kingbase如何实现Oracle的userenv函数功能。

2. 文档概述

本文主要是通过调研Oracle的userenv函数功能,然后基于kingbase自定义函数形式实现userenv函数功能。

3. Oracle userenv()函数功能调研

3.1. 函数名称/函数原型

userenv(‘parameter’);

3.2. 函数功能

userenv函数的功能是返回有关当前会话的信息。例如返回语言名称的ISO缩写、当前数据库使用的语言和地区以及数据库字符集、当前会话ID等等

3.3. 参数介绍

3.3.1. Parameter

Parameter表示当前需要获取的有关当前会话的信息描述字符串。具体的如下表:

CLINET_INFO

返回最高可达64个字节存储的用户会话信息,可由应用程序使用DBMS_APPLICATION_INFO包。

ENTRYID

返回当前审计条目编号。审计的EntryID序列细粒度的审计记录和定期审计记录之间共享。在分布式SQL语句不能使用这个属性。

ISDBA

如果用户已经被认证为dba;或者是通过操作系统或口令文件具有DBA特权的,返回“TRUE",否则返回"FALSE"。

LANG

返回ISO缩写语言名称,一个比现有的“语言”参数较短的形式。

LANGUAGE

返回数据库当前会话的语言、地域和字符集。

SESSIONID

返回审计会话标识符。在分布式SQL语句不能指定此参数。

SID

返回数据库会话ID。

TERMINAL

返回当前会话的终端操作系统的标识符。在分布式SQL语句,此参数返回了标识符为本地会话。在分布式环境中,此参数只支持远程SELECT语句,不用于远程INSERT,UPDATE或DELETE操作。

3.4. 函数示例

3.4.1. 示例1: 

SQL> select userenv('language') from dual;


USERENV('LANGUAGE')
----------------------------------------------------
AMERICAN_AMERICA.ZHS16GBK

3.5. 基于Kingbase适配userenv函数功能的实现

3.5.1. 实现userenv(‘parameter’);函数

1、创建userenv函数的空壳,支持任意变量的输入。

create or replace function userenv(anynonarray) returns anynonarray as $$    
declare    
begin    
  case lower($1)    
  when 'sessionid' then    
    return get_session_id();    
  when 'isdba' then    
    return get_isdba();    
  when 'action' then    
    return get_action();    
  when 'lang' then  
    return get_lang();  
  when 'language' then  
    return get_language();  
  else     
    return null;    
  end case;    
end;    
$$ language plpgsql strict;   
CREATE FUNCTION

2、根据oracle中对应的例子去编写对应的实际函数

USERENV(‘SESSIONID’)

  • 创建一个序列
create sequence public.pg_session_id_sequence_oracle_comp;
  • 授权序列
grant all on sequence public.pg_session_id_sequence_oracle_comp to public;
  • 创建依赖函数
create OR replace function get_session_id() returns int8 AS $$     
declare res int8;     
begin    
SELECT currval('public.pg_session_id_sequence_oracle_comp') into res;     
return res;     
exception      
    WHEN sqlstate '55000' THEN      
SELECT nextval('public.pg_session_id_sequence_oracle_comp') into res;     
return res;      
    WHEN sqlstate '42P01' THEN      
create sequence public.pg_session_id_sequence_oracle_comp;    
SELECT nextval('public.pg_session_id_sequence_oracle_comp') into res;     
return res;     
end;     
$$ language plpgsql strict SET client_min_messages to error;
  • 使用
select userenv('sessionid'::Text);

 USERENV
---------
 1
(1 行记录)

USERENV(‘ISDBA’)

  • 创建依赖函数 
create OR replace function get_isdba() returns boolean AS $$     
  select rolsuper from pg_roles where rolname=current_user;    
$$ language sql strict SET client_min_messages to error; 
  • 使用
select userenv('isdba'::Text);

 USERENV
---------
 true
(1 行记录)

USERENV(‘ACTION’)

  • 创建依赖函数
create OR replace function get_ACTION() returns text AS $$     
  select application_name from pg_stat_activity where pid=pg_backend_pid();    
$$ language sql strict SET client_min_messages to error;
  • 使用
select userenv('action'::Text);

 USERENV
---------
 psql
(1 行记录)

USERENV(‘LANG’)

  • 创建依赖函数
create OR replace function get_LANG() returns text AS $$     
   select (regexp_split_to_array(current_setting('lc_messages'), '\.'))[1];    
$$ language sql strict;
  • 使用
select userenv('lang'::text);

 USERENV
---------
 en_US
(1 行记录)

USERENV(‘LANGUAGE’)

  • 创建依赖函数
create OR replace function get_LANGUAGE() returns text AS $$     
    select (regexp_split_to_array(current_setting('lc_monetary'), '\.'))[1]||'.'||pg_client_encoding();  
 $$ language sql strict;  
  • 使用
select userenv('language'::text);

  USERENV
------------
 en_US.UTF8
(1 行记录)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值