oracle_Edition-Based-Redefinition数据库版本
(2018-07-10 23:11:47)
标签:
upgradeddleditionviewrolling |
分类: oracleops |
(同志们,好久不见。)
本文章内容主要针对灰度发布针对数据库端表级别不同版本对应用的不兼容性问题。
下面关于的edition-based redefinition的介绍: edition
可以理解成“版本”。
一个database至少有一个缺省的edition
创建一个edition,子句as child
of缺省继承上一个edition,即父集,一个edition只能有一个父集和子集,也就是不加子句的话默认继承上一个,进行删除时必须保证子集被删;
设置数据库的缺省edition
与edition相关的系统权限有
与edition相关的数据字典
通过不同的edition连接数据库
11gR2中editions支持的objects
type有
用户要想使用edition,必须先Enable editions for a
schema。
一个存在的应用将要使用edition需要以下准备:
在基表上创建editioning view,与原表的结构相同,同时对失效对象进行编译,使之有效。
如果需要,应用VPD策略在ev上。
回收基表上的权限,并实施在ev上。
不同edition间的切换
数据库服务和editions
SQL>SELECT name, edition
FROM dba_services;
$SQLPLUS
edition_test/edition_test@//localhost:1521/DB11G.WORLD
SELECT SYS_CONTEXT('USERENV', 'SESSION_EDITION_NAME') AS
edition FROM dual;
实战1: 升降级没有数据传输
SQL> conn sun/sun
Connected.
SQL> alter session set edition=release_v1;
Session altered.
SQL> SELECT SYS_CONTEXT('USERENV', 'SESSION_EDITION_NAME')
AS edition FROM dual;
EDITION
--------------------------------------------------------------------------------
RELEASE_V1
SQL> CREATE TABLE employees_tab (
Table created.
SQL> CREATE SEQUENCE employees_seq;
Sequence created.
SQL> CREATE OR REPLACE EDITIONING VIEW employees AS
View created.
SQL> CREATE OR REPLACE PROCEDURE
create_employee (p_name
IN
employees.name%TYPE,
Procedure created.
SQL> BEGIN
PL/SQL procedure successfully completed.
SQL>
SQL> SELECT * FROM employees;
EMPLOYEE_ID NAME
DATE_OF_B
----------- ----------------------------------------
---------
COLUMN object_name FORMAT A20
SELECT object_name, object_type, edition_name
FROM user_objects_ae
ORDER BY object_name;
##可以看到table,index,sequence是没有editon属性的
SQL> ALTER SESSION SET EDITION = release_v2;
Session altered.
SQL> BEGIN
PL/SQL procedure successfully completed.
SQL> SELECT * FROM employees;
EMPLOYEE_ID NAME
DATE_OF_B
----------- ----------------------------------------
---------
SQL> ALTER TABLE employees_tab ADD (
Table altered.
SQL> ALTER SESSION SET EDITION = release_v1;
Session altered.
SQL>
SQL> BEGIN
PL/SQL procedure successfully completed.
SQL>
SQL> SELECT * FROM employees;
EMPLOYEE_ID NAME
DATE_OF_B
----------- ----------------------------------------
---------
SQL> ALTER SESSION SET EDITION = release_v2;
Session altered.
SQL> CREATE OR REPLACE EDITIONING VIEW employees AS
View created.
SQL> CREATE OR REPLACE PROCEDURE create_employee (p_name
IN employees.name%TYPE,
Procedure created.
SQL> BEGIN
PL/SQL procedure successfully completed.
SQL> SET LINESIZE 100
SQL> SELECT * FROM employees;
EMPLOYEE_ID NAME
DATE_OF_B POSTCODE
----------- ---------------------------------------- ---------
--------------------
SELECT object_name, object_type, edition_name
FROM user_objects_ae
ORDER BY object_name, edition_name;
OBJECT_NAME
OBJECT_TYPE
EDITION_NAME
-------------------- -------------------
------------------------------
EMPLOYEES_TAB
TABLE
EMPLOYEES_PK
INDEX
EMPLOYEES_SEQ
SEQUENCE
EMPLOYEES
VIEW
RELEASE_V2
EMPLOYEES
VIEW
RELEASE_V1
CREATE_EMPLOYEE
PROCEDURE
RELEASE_V2
CREATE_EMPLOYEE
PROCEDURE
RELEASE_V1
##可以看到table,index,sequence是没有editon属性的
SQL> ALTER SESSION SET EDITION =
release_v1;
Session altered.
SQL> SELECT * FROM employees;
EMPLOYEE_ID NAME
DATE_OF_B
----------- ----------------------------------------
---------
实战2:
升降级需要互相进行数据传输
在新系统通过创建forward crossediton trigger
,reverse crossedition trigger 实现三列的转换,
新老系统操作ev触发对基表的三列的不同更新;
SQL> conn sun/sun
Connected.
SQL>
SQL>
SQL> ALTER TABLE employees_tab ADD (
Table altered.
SQL> UPDATE employees_tab
4 rows updated.
SQL>
SQL> ALTER TABLE employees_tab MODIFY (
Table altered.
SQL> SELECT * FROM employees_tab ;
EMPLOYEE_ID NAME
DATE_OF_B POSTCODE
FIRST_NAME
LAST_NAME
----------- --------------- --------- --------------------
-------------------- --------------------
SQL> CREATE OR REPLACE EDITIONING VIEW employees AS
View created.
SQL> SQL> CREATE OR REPLACE PROCEDURE create_employee
(p_first_name IN
employees.first_name%TYPE,
Procedure created.
SQL> CREATE OR REPLACE TRIGGER employees_fwd_xed_trg
Trigger created.
SQL> CREATE OR REPLACE TRIGGER employees_rvrs_xed_trg
Trigger created.
SQL> ALTER TRIGGER employees_fwd_xed_trg ENABLE;
Trigger altered.
SQL> ALTER TRIGGER employees_rvrs_xed_trg ENABLE;
Trigger altered.
SELECT object_name, object_type, edition_name
FROM user_objects_ae
ORDER BY object_name, edition_name;
OBJECT_NAME
OBJECT_TYPE
EDITION_NAME
------------------------- -------------------
------------------------------
EMPLOYEES_TAB
TABLE
EMPLOYEES_PK
INDEX
EMPLOYEES_SEQ
SEQUENCE
EMPLOYEES
VIEW
RELEASE_V2
EMPLOYEES
VIEW
RELEASE_V3
EMPLOYEES
VIEW
RELEASE_V1
CREATE_EMPLOYEE
PROCEDURE
RELEASE_V2
CREATE_EMPLOYEE
PROCEDURE
RELEASE_V1
CREATE_EMPLOYEE
PROCEDURE
RELEASE_V3
EMPLOYEES_FWD_XED_TRG
TRIGGER
RELEASE_V3
EMPLOYEES_RVRS_XED_TRG
TRIGGER
RELEASE_V3
## 在对表first_name和last_name列进行not
null操作前,先确保老系统没有对基表的DML操作,pending后再使用employees_fwd_xed_trg对name做更新。
SQL> DECLARE
PL/SQL procedure successfully completed.
SQL> DECLARE
PL/SQL procedure successfully completed.
SQL> ALTER TABLE employees_tab MODIFY (
SQL> SELECT SYS_CONTEXT('USERENV', 'SESSION_EDITION_NAME')
AS edition FROM dual;
EDITION
-------------------------
RELEASE_V3
SQL> BEGIN
PL/SQL procedure successfully completed.
-- Check the editioning
view.
SQL> SET LINESIZE 100
SQL> SELECT * FROM employees;
EMPLOYEE_ID FIRST_NAME
LAST_NAME
DATE_OF_B
POSTCODE
----------- -------------------- --------------------
--------- --------------------
-- Check the base table.
----------- -------------------- --------- ----------
-------------------- --------------------
SQL> ALTER SESSION SET EDITION = release_v2;
Session altered.
SQL> BEGIN
PL/SQL procedure successfully completed.
SQL> -- Check editioning
view.
SQL> COLUMN name FORMAT A25
SQL>
SQL> SELECT * FROM employees;
EMPLOYEE_ID NAME
DATE_OF_B
POSTCODE
----------- ------------------------- ---------
----------
6 rows selected.
SQL>
SQL> -- Check base
table.
SQL> SELECT * FROM employees_tab;
EMPLOYEE_ID NAME
DATE_OF_B
POSTCODE FIRST_NAME
LAST_NAME
----------- ------------------------- --------- ----------
-------------------- --------------------