CS_SESSION 程序包

CS_SESSION 软件包提供了一个用于切换现有会话的数据库服务和使用者组的接口。

注意:

Oracle Database 19c(从版本 19.28 开始)和 Oracle Database 23ai(从版本 23.9 开始)中提供了对 CS_SESSION 软件包的支持。

Autonomous Database 建立连接后,会为该会话分配一个使用者组。例如,可以使用与 Autonomous Database 的 LOW 服务的连接来创建会话。您可能希望将使用者组从 LOW 切换到 HIGH。CS_SESSION 软件包提供了用于交换的 API。有关详细信息,请参阅自治数据库的预定义数据库服务名称

使用者组确定并发性和并行度 (DOP)。例如,建立到 LOW 数据库服务的连接上的语句将串行运行。建立到 HIGH 数据库服务的连接的语句并行运行。如果工作负荷需要串行语句处理,并且需要切换到 HIGH 使用者组来执行一些语句,则可以使用 CS_SESSION 软件包进行切换。

SWITCH_SERVICE 过程

此过程将切换当前会话的数据库服务和使用者组。

语法

CS_SESSION.SWITCH_SERVICE(service_name IN varchar2);

参数

Parameter (参数) 说明
service_name

指定要更新的使用者组。

根据工作量,有效值为:HIGHMEDIUMLOWTPTPURGENT

使用说明

调用时,该过程会将会话切换到指定服务和相关使用者组。如果指定的服务在该数据库中不存在,则会提供错误消息。例如,如果在数据仓库工作量上将 'TP' 指定为服务名,则错误会指明它不是有效的服务名。如果当前服务和指定服务相同,则不会报告任何错误。

该过程不会重置会话属性。在调用此过程之前,用户为其会话设置的任何内容都将按原样继续。例如,如果修改了会话参数,然后会话切换到其他服务,则该参数值将保持不变。

范例

BEGIN
  CS_SESSION.SWITCH_SERVICE('HIGH');
END;
/

安全性和访问权限

使用 GRANT OPTIONADMIN 用户授予对 CS_SESSIONEXECUTE 权限。该权限也授予 DWROLE 而不授予 GRANT OPTION

其他安全注意事项

如果向用户授予对此过程的 EXECUTE 特权,并且您不希望该用户切换到特定服务,则可以使用 AFTER SET CONTAINER 触发器阻止该操作。这是通过创建 AFTER SET CONTAINER 触发器来实现的。

CREATE OR REPLACE TRIGGER SESS_SWITCH
AFTER SET CONTAINER ON DATABASE
BEGIN
IF SYS_CONTEXT('USERENV','SESSION_USER') = 'USER' and
   SYS_CONTEXT('USERENV','SERVICE_NAME') = 'serviceexample_low.adwc.oraclecloud.com'
THEN
    NULL;
ELSE
    RAISE_APPLICATION_ERROR(-20001, 'Denied!  You are not allowed to switch service in the database');
END IF;
END;
/

Error Messages

下表介绍了 CS_SESSION 的例外

错误 消息 原因
20001 服务名无效。有效值为 HIGH、MEDIUM、LOW。 对于数据仓库工作量,指定了除 'HIGH'、'MEDIUM' 和 'LOW' 之外的值。
20001 服务名无效。有效值为 HIGH、MEDIUM、LOW、TP、TPURGENT。 对于事务处理工作量,指定了除“HIGH”、“MEDIUM”、“LOW”、“TP”和“TPURGENT”之外的值。
20002 服务切换失败。 无法切换到新服务。