Skip to content

Commit 9a19c93

Browse files
committed
add adocs for sys_context function
1 parent 6347a79 commit 9a19c93

8 files changed

Lines changed: 393 additions & 96 deletions

File tree

CN/modules/ROOT/nav.adoc

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,9 @@
2626
**** xref:master/6.3.2.adoc[OUT 参数]
2727
**** xref:master/6.3.4.adoc[%TYPE、%ROWTYPE]
2828
**** xref:master/6.3.5.adoc[NLS 参数]
29-
*** xref:master/6.4.adoc[国标GB18030]
29+
*** 内置函数
30+
**** xref:master/6.4.1.adoc[sys_context]
31+
*** xref:master/6.5.adoc[国标GB18030]
3032
** Oracle兼容功能列表
3133
*** xref:master/7.1.adoc[1、框架设计]
3234
*** xref:master/7.2.adoc[2、GUC框架]
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
2+
:sectnums:
3+
:sectnumlevels: 5
4+
5+
6+
= **功能概述**
7+
8+
IvorySQL提供兼容Oracle内置函数`SYS_CONTEXT('namespace', 'parameter' [, length ])`,
9+
返回当前时刻与给定上下文关联参数的值,可以在SQL和PLSQL语言中使用。
10+
11+
== 实现原理
12+
13+
SYS_CONTEXT的实现原理是通过动态查询系统表与postgres的内置函数,确保结果的实时性,
14+
使用 SECURITY INVOKER 确保函数以调用者的权限执行,避免权限提升问题。
15+
该方法的实现逻辑如下:
16+
```sql
17+
CREATE OR REPLACE FUNCTION sys.sys_context(a varchar2, b varchar2)
18+
RETURNS varchar2 AS $$
19+
DECLARE
20+
res varchar2;
21+
BEGIN
22+
IF upper(a) = 'USERENV' THEN
23+
CASE upper(b)
24+
WHEN 'CURRENT_SCHEMA' THEN
25+
SELECT current_schema() INTO res;
26+
WHEN 'LANG' THEN
27+
SELECT sys.get_lang() INTO res;
28+
...
29+
ELSE
30+
RAISE EXCEPTION 'invalid USERENV parameter: %', b;
31+
END CASE;
32+
ELSIF upper(a) = 'SYS_SESSION_ROLES' THEN
33+
CASE upper(b)
34+
WHEN 'LOGIN' THEN
35+
SELECT CASE WHEN rolcanlogin = 't' THEN 'TRUE' ELSE 'FALSE' END INTO res FROM pg_roles WHERE oid = current_user::regrole::oid;
36+
...
37+
ELSE
38+
RAISE EXCEPTION 'invalid SYS_SESSION_ROLES parameter: %', b;
39+
END CASE;
40+
ELSE
41+
SELECT current_setting(a||'.'||b, true) INTO res;
42+
END IF;
43+
RETURN res;
44+
END;
45+
$$ LANGUAGE plisql SECURITY INVOKER;
46+
```
47+
== USERENV支持的参数
48+
[cols="2,8"]
49+
|====
50+
|*参数名称*|*返回值*
51+
|CURRENT_SCHEMA | 当前活动默认模式的名称。在会话期间,可以通过 ALTER SESSION SET CURRENT_SCHEMA 语句更改该值。该值也可能在会话期间发生变化,以反映任何活动定义者权限对象的所有者。如果直接在视图定义的正文中使用,那么将返回在执行使用视图的游标时使用的默认模式。
52+
|CURRENT_SCHEMAID | 当前活动的默认模式的标识符。
53+
|SESSION_USER | 当前session的用户
54+
会话用户(登录用户)的名称。在数据库会话期间,随着 Real Application Security 会话的附加或分离,该名称可能会发生变化。对于企业用户,返回模式。对于其他用户,返回数据库用户名。如果数据库会话当前附加了 Real Application Security 会话,则返回用户 XS$NULL。
55+
|SESSION_USERID | 当前session的用户ID。
56+
|PROXY_USER | 代表 SESSION_USER 打开当前会话的数据库用户名称。
57+
|PROXY_USERID | 代表 SESSION_USER 打开当前会话的数据库用户的标识符。
58+
|CURRENT_USER | 当前会话中执行操作的用户。
59+
|CURRENT_USERID | 当前会话中执行操作的用户标识符。
60+
|CURRENT_EDITION_NAME | 当前版本的名字。
61+
|CLIENT_PROGRAM_NAME | 客户端程序的名称。
62+
|====
63+
[cols="2,8"]
64+
|====
65+
|*参数名称*|*返回值*
66+
|IP_ADDRESS | 客户端的IP地址。
67+
|HOST | 客户端主机的名称。
68+
|ISDBA | 如果当前用户是数据库管理员,则返回TRUE。
69+
|LANG | 语言的缩写名称,比现有的 “LANGUAGE ”参数更简短。
70+
|LANGUAGE | 当前会话的使用的语言和地区,以及数据库字符集,格式为:language_territory.characterset。
71+
|NLS_DATE_FORMAT | 当前session的日期格式。
72+
|PLATFORM_SLASH | 在用户的平台上用作文件路径分隔符的斜线字符(Unix或Linux是’/’,Windows是’\’)。
73+
|DB_NAME | 当前连接的CDB的名称。
74+
|SID | 当前会话的系统标识符。
75+
|SESSIONID | 审计会话标识符。不能在分布式 SQL 语句中使用此属性。
76+
|CLIENT_INFO | 返回最多 64 字节的用户会话信息,应用程序可使用 DBMS_APPLICATION_INFO 包存储这些信息。
77+
|ENTRYID | 当前审计条目编号。审计条目编号序列在细粒度审计记录和常规审计记录之间共享。不能在分布式 SQL 语句中使用此属性。只有通过标准或细粒度审计的审计处理程序才能看到正确的审计条目标识符。
78+
|TERMINAL | 当前会话客户端的操作系统标识符。在分布式 SQL 语句中,该属性返回本地会话的标识符。在分布式环境中,仅支持远程 SELECT 语句,不支持远程 INSERT、UPDATE 或 DELETE 操作。(此参数的返回长度可能因操作系统而异)。
79+
|====
80+
== SYS_SESSION_ROLES支持的参数
81+
[cols="2,8"]
82+
|====
83+
|*参数名称*|*返回值*
84+
|DBA | 如果当前用户是数据库管理员,则返回TRUE。
85+
|LOGIN | 如果当前用户是登录角色,则返回TRUE。
86+
|CREATEROLE | 如果当前session的用户具有创建角色的权限,则返回TRUE。
87+
|CREATEDB | 如果当前session的用户具有创建数据库的权限,则返回TRUE。
88+
|====

0 commit comments

Comments
 (0)