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