Oracle 版本 19.20.0.0.0。
我们正在尝试测试 Oracle 的基于版本的重定义功能是否可以帮助我们在修改某些 PLSQL 对象时消除应用程序中断的需要。
我们已经尝试在执行 PLSQL 代码之前使用
DBMS_SESSION.RESET_PACKAGE
调用,但在我们的所有场景中都不起作用。
所以我有 2 个模式 -
the_user
和 the_coder
。
the_coder
包含 the_user
将执行的 PLSQL 对象。
因此我为版本启用
the_coder
,如下所示:
GRANT CREATE ANY EDITION, DROP ANY EDITION TO the_coder;
ALTER USER the_coder ENABLE EDITIONS FORCE;
然后作为
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;
如
the_user
:
SELECT the_coder.the_pkg.f FROM dual;
M
---------------------------------------
Hello world
数据库只有默认版本
ORA$BASE
。
现在让我们尝试一些 EBR,如
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;
然后作为
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
版本即可。
这可能吗?
通常情况下,你会
ALTER DATABASE DEFAULT EDITION = ebr_poc;
一旦您确认新版本中的代码可以正常工作。如果您不想在系统中保留大量版本,则可以在不再有任何连接使用旧版本后删除旧版本。
ORA$BASE
没有什么特别之处,只是它是安装新数据库时存在的唯一版本。当不再需要它时,您可以像任何其他用户创建的版本一样删除它。
用户应该删除 ORA$BASE 吗?
需要删除ORA$Base 可以删除其他旧的、退役的版本之前的版本。这 ORA$Base 版本除了它是 当数据库是时,为数据库中的一个版本指定的名称 第一次创建。我们所有现有的客户都愉快地使用过 多年来基于版本的重新定义都放弃了ORA$Base 许多年前的版本,因此没有出现任何问题。