磐维数据库,简称"PanWeiDB"。是中国移动信息技术中心首个基于中国本土开源数据库打造的面向ICT基础设施的自研数据库产品。其产品内核能力基于openGauss开源软件,并进一步提升了系统稳定性及多种数据库兼容性。
在一个Oracle迁移项目中,有张表迁移数据时遇到如下错误:
code: 42883 msg: function sys_context(unknown, unknown) does not exist
目标库使用的是PanWeiDB 1.0,还不支持sys_context函数,PanWeiDB 2.0可以使用sys_context函数,下面将介绍sys_context函数的具体使用示例。
sys_context函数的语法格式
语法格式如下:
sys_context('namespace', 'parameter' [, length ])
sys_context函数的参数说明
namespace参数是命名空间,目前只支持USERENV命名空间。
parameter参数是用户查询的参数,目前支持如下参数:
| 序号 | 参数名称 | 描述 |
|---|---|---|
| 1 | action | 通过dbms_application_info.set_action设置 |
| 2 | client_info | 通过dbms_application_info.set_client_info设置 |
| 3 | client_program_name | 会话的客户端程序名称 |
| 4 | current_edition_id | 数据库的版本号 |
| 5 | current_edition_name | 数据库的版本信息 |
| 6 | current_schema | 查询路径 |
| 7 | current_schemaid | 当前schema的oid标识 |
| 8 | current_user | 当前用户名 |
| 9 | current_userid | 当前用户的oid标识符 |
| 10 | database_role | 当前用户名 |
| 11 | db_name | 数据库名称 |
| 12 | db_unique_name | 数据库名称 |
| 13 | host | 客户端主机名称 |
| 14 | ip_address | 服务器ip地址 |
| 15 | is_superuser | 用户是否有sysadmin权限 |
| 16 | lang | 当前db语言环境的简化形式 |
| 17 | language | 当前db语言环境的详细形式 |
| 18 | module | 通过dbms_application_info包设置 |
| 19 | network_protocol | 通信网络协议 |
| 20 | nls_calendar | 会话的当前日历 |
| 21 | nls_currency | 会话的货币符号 |
| 22 | nls_date_format | 会话的日期格式 |
| 23 | nls_date_language | 会话日期的语言 |
| 24 | nls_sort | 排序方式 |
| 25 | nls_territory | 会话的所处地 |
| 26 | vast_home | 数据库主目录路径 |
| 27 | os_user | 操作系统用户名 |
| 28 | platform_slash | 操作系统文件路径分隔符 |
| 29 | server_host | 数据库主机名 |
| 30 | service_name | 当前连接的数据库名 |
| 31 | session_default_collation | 会话的collation |
| 32 | session_edition_id | 数据库版本号 |
| 33 | session_edition_name | 数据库版本信息 |
| 34 | session_user | 会话用户名称 |
| 35 | session_userid | 会话用户的oid |
| 36 | sid | sid |
| 37 | terminal | 当前会话的客户端的操作系统标识,返回本地会话的标识符 |
sys_context函数的常用示例
1.获取action
postgres=# exec dbms_application_info.set_action('myAction');
set_action
------------
(1 row)
postgres=# select sys_context('userenv','action');
sys_context
-------------
myAction
(1 row)
2.获取client_info
postgres=# select sys_context('userenv','client_info');
sys_context
-------------
client A
(1 row)
通过dbms_application_info.set_client_info设置后再获取
postgres=# exec dbms_application_info.set_client_info('my gsql client');
set_client_info
-----------------
(1 row)
postgres=# select sys_context('userenv','client_info');
sys_context
----------------
my gsql client
(1 row)
3.获取客户端程序名称
会话的客户端程序名称
postgres=# select sys_context('userenv','client_program_name');
sys_context
-------------
gsql
(1 row)
4.获取数据库的版本号
数据库的版本号
postgres=# select sys_context('userenv','current_edition_id');
sys_context
-------------
2.0.0
(1 row)
5.获取数据库的版本信息
数据库的版本信息,相当于pw_version()返回信息
postgres=# select sys_context('userenv','current_edition_name');
sys_context
-------------------------------------------------------------------------
(PanWeiDB 2.0.0 (Build0)) compiled at 2023-11-30 10:41:56 commit 03b85d1 last mr +
product name:PanWeiDB +
version:2.0.0 +
patch:0 +
commit:03b85d1 +
openGauss version:5.0.0 +
host:aarch64-unknown-linux-gnu
(1 row)
6.获取当前查询路径
当前用户的查询路径,即search_path值
postgres=# select sys_context('userenv','current_schema');
sys_context
----------------
"$user",public
(1 row)
上面是默认的查询路径,修改后再观察:
postgres=# set search_path to public;
SET
postgres=# select sys_context('userenv','current_schema');
sys_context
-------------
public
(1 row)
7.获取当前schema的oid标识
postgres=# set search_path to public;
SET
postgres=# select sys_context('userenv','current_schemaid');
sys_context
-------------
2200
(1 row)
postgres=# select 2200::regnamespace;
regnamespace
--------------
public
(1 row)
8.获取当前user
postgres=# select sys_context('userenv','current_user');
sys_context
-------------
panwei
(1 row)
9.获取当前userid
postgres=# select sys_context('userenv','current_userid');
sys_context
-------------
10
(1 row)
10.获取database_role
与第8项类似
postgres=# select sys_context('userenv','database_role');
sys_context
-------------
panwei
(1 row)
11.获取当前连接的数据库名称
\c panweidb
panweidb=# select sys_context('userenv','db_name');
sys_context
-------------
panweidb
(1 row)
12.获取db_unique_name
与第11项类似
panweidb=# select sys_context('userenv','db_unique_name');
sys_context
-------------
panweidb
(1 row)
13.获取客户端主机名称
panweidb=# select sys_context('userenv','host');
sys_context
-------------
node1
(1 row)
14.获取服务器ip地址
panweidb=# select sys_context('userenv','ip_address');
sys_context
-------------
192.168.20.200
(1 row)
15.获取is_superuser
当前用户是否有sysadmin权限
panweidb=# select sys_context('userenv','is_superuser');
sys_context
-------------
TRUE
(1 row)
16.获取lang
当前db语言环境的简写形式
panweidb=# select sys_context('userenv','lang');
sys_context
-------------
en_US
(1 row)
17.获取language
当前db语言环境的详细形式
panweidb=# select sys_context('userenv','language');
sys_context
-------------
en_US.UTF-8
(1 row)
18.获取module
panweidb=# exec dbms_application_info.set_module('module_panwei','action1');
set_module
------------
(1 row)
panweidb=# select sys_context('userenv','module');
sys_context
---------------
module_panwei
(1 row)
19.获取通信网络协议
网络协议,固定为tcp
panweidb=# select sys_context('userenv','network_protocol');
sys_context
-------------
tcp
(1 row)
20.获取当前日历
默认为空
panweidb=# select sys_context('userenv','nls_calendar');
sys_context
-------------
(1 row)
21.获取货币符号
panweidb=# select sys_context('userenv','nls_currency');
sys_context
-------------
$
(1 row)
22.获取日期格式
panweidb=# select sys_context('userenv','nls_date_format');
sys_context
--------------
YEAR-MON-DAY
(1 row)
23.获取日期格的语言
panweidb=# select sys_context('userenv','nls_date_language');
sys_context
-------------
English
(1 row)
24.获取排序方式
当前排序方式固定为BINARY
panweidb=# select sys_context('userenv','nls_sort');
sys_context
-------------
BINARY
(1 row)
25.获取nls_territory
panweidb=# select sys_context('userenv','nls_territory');
sys_context
-------------
CHINA
(1 row)
26.获取数据库主目录路径
panweidb=# select sys_context('userenv','vast_home');
sys_context
------------------
/opt/panweidb200
(1 row)
27.获取操作系统用户名
panweidb=# select sys_context('userenv','os_user');
sys_context
-------------
omm
(1 row)
28.获取操作系统文件路径分隔符
panweidb=# select sys_context('userenv','platform_slash');
sys_context
-------------
/
(1 row)
29.获取数据库主机名
panweidb=# select sys_context('userenv','server_host');
sys_context
-------------
node1
(1 row)
30.获取service_name
service_name在磐维数据库指当前连接的数据库名
panweidb=# select sys_context('userenv','service_name');
sys_context
-------------
panweidb
(1 row)
31.获取collation
panweidb=# select sys_context('userenv','session_default_collation');
sys_context
-------------
en_US.UTF-8
(1 row)
32.获取数据库版本号
panweidb=# select sys_context('userenv','session_edition_id');
sys_context
-------------
2.0.0
(1 row)
33.获取数据库的版本信息
数据库的版本信息,相当于pw_version()返回信息
panweidb=# select sys_context('userenv','session_edition_name');
sys_context
-----------------------------------------------------------------------
(PanWeiDB 2.0.0 (Build0)) compiled at 2023-11-30 10:41:56 commit 03b85d1 last mr +
product name:PanWeiDB +
version:2.0.0 +
patch:0 +
commit:03b85d1 +
openGauss version:5.0.0 +
host:aarch64-unknown-linux-gnu
(1 row)
34.获取会话用户名称
panweidb=# select sys_context('userenv','session_user');
sys_context
-------------
panwei
(1 row)
35.会话用户的oid
panweidb=# select sys_context('userenv','session_userid');
sys_context
-------------
10
(1 row)
36.获取sid
当前的sid值默认为0
panweidb=# select sys_context('userenv','sid');
sys_context
-------------
0
(1 row)
37.获取terminal
会话的客户端标识,返回本地会话的标识符,与第13项输出一致。
panweidb=# select sys_context('userenv','terminal');
sys_context
-------------
node1
(1 row)
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




