目录
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 行记录)