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版本执行:
- 以
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;
- 将导出的DDL复制后,切换回
ORA$BASE版本执行即可。
注意事项
- 同步操作前,需确保
ORA$BASE版本中无正在运行的会话依赖旧版本对象(同步完成后,新会话将直接使用更新后的对象)。 - 若对象存在依赖关系,需按依赖顺序同步(例如先同步包规范,再同步包体)。
内容的提问来源于stack exchange,提问作者Pro West
相关产品推荐
相关产品推荐

