You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle 19.20 EBR技术:如何将ebr_poc版本变更推广至ORA$BASE?

Oracle 19c EBR:将版本变更同步回默认ORA$BASE版本的方法

环境与背景

  • Oracle版本:19.20.0.0.0
  • 测试目标:验证基于版本的重定义(EBR)能否在修改PL/SQL对象时避免应用停机
  • 现有模式:the_user(执行PL/SQL对象的业务用户)、the_coder(持有PL/SQL对象的开发用户)
  • 已尝试方案:调用DBMS_SESSION.RESET_PACKAGE,但无法覆盖所有场景

已完成的操作步骤

1. 为the_coder启用版本支持

以拥有管理员权限的用户执行:

GRANT CREATE ANY EDITION, DROP ANY EDITION TO the_coder;

ALTER USER the_coder ENABLE EDITIONS FORCE;

2. 在默认版本ORA$BASE中创建PL/SQL对象

以the_coder身份执行:

CREATE OR REPLACE PACKAGE the_pkg AS
   FUNCTION f RETURN VARCHAR2;
END the_pkg;
/

CREATE OR REPLACE PACKAGE BODY the_pkg AS
   FUNCTION f RETURN VARCHAR2 IS
   BEGIN 
      RETURN ( 'Hello world' );
   END f;
END the_pkg;
/

GRANT EXECUTE ON the_pkg TO the_user;

3. 验证默认版本的对象功能

以the_user身份执行:

SELECT the_coder.the_pkg.f FROM dual;

执行结果:

M
---------------------------------------
Hello world

4. 创建测试版本并修改对象

以the_coder身份执行:

CREATE EDITION ebr_poc;

GRANT USE ON EDITION ebr_poc TO the_user;

ALTER SESSION SET EDITION = ebr_poc;

CREATE OR REPLACE PACKAGE the_pkg AS
   FUNCTION f RETURN VARCHAR2;
END the_pkg;
/

CREATE OR REPLACE PACKAGE BODY the_pkg AS
   FUNCTION f RETURN VARCHAR2 IS
   BEGIN 
      RETURN ( 'Hello world, again' );
   END f;
END the_pkg;
/

GRANT EXECUTE ON the_pkg TO the_user;

5. 验证测试版本的对象功能

以the_user身份执行:

ALTER SESSION SET EDITION = ebr_poc;
SELECT the_coder.the_pkg.f FROM dual;

执行结果:

M
---------------------------------------
Hello world, again

用户疑问

如何将ebr_poc版本中的变更推广至默认的ORA$BASE版本?是否可以直接同步变更回ORA$BASE,而非持续新增版本并指定默认版本?

解答

可行性说明

直接将子版本的变更同步回父版本(ORA$BASE是ebr_poc的父版本)是可行的,Oracle虽无一键同步的内置工具,但可通过手动执行DDL或导出/导入的方式完成迁移。

具体操作方法

方法1:手动重定义对象(推荐)

以the_coder身份切换回ORA$BASE版本,重新执行ebr_poc版本中修改后的PL/SQL对象定义:

ALTER SESSION SET EDITION = ORA$BASE;

-- 重新创建包规范(若有变更)
CREATE OR REPLACE PACKAGE the_pkg AS
   FUNCTION f RETURN VARCHAR2;
END the_pkg;
/

-- 重新创建包体(复用ebr_poc版本中的逻辑)
CREATE OR REPLACE PACKAGE BODY the_pkg AS
   FUNCTION f RETURN VARCHAR2 IS
   BEGIN 
      RETURN ( 'Hello world, again' );
   END f;
END the_pkg;
/

注:权限无需重复授予,因为权限绑定的是用户与对象,而非版本。

方法2:使用DBMS_METADATA导出对象定义

若需同步的对象较多,可通过DBMS_METADATA从ebr_poc版本导出对象DDL,再到ORA$BASE版本执行:

  1. 以the_coder身份切换到ebr_poc版本,导出DDL:
ALTER SESSION SET EDITION = ebr_poc;

SET LONG 1000000;
SELECT DBMS_METADATA.GET_DDL('PACKAGE', 'THE_PKG', 'THE_CODER') FROM dual;
SELECT DBMS_METADATA.GET_DDL('PACKAGE_BODY', 'THE_PKG', 'THE_CODER') FROM dual;
  1. 将导出的DDL复制后,切换回ORA$BASE版本执行即可。

注意事项

  • 同步操作前,需确保ORA$BASE版本中无正在运行的会话依赖旧版本对象(同步完成后,新会话将直接使用更新后的对象)。
  • 若对象存在依赖关系,需按依赖顺序同步(例如先同步包规范,再同步包体)。

内容的提问来源于stack exchange,提问作者Pro West

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 12:55:54