Edition-Based Redefinition

Download Report

Transcript Edition-Based Redefinition

Edition-Based
Redefinition
Julian Dyke
Independent Consultant
Web Version
1
© 2010 Julian Dyke
juliandyke.com
Edition-Based Redefinition
Overview



Introduced in Oracle 11.2
Online Application Upgrade
Goals are:
 Installation of upgrade into production database is invisible to current
users of pre-upgrade application
 Transactions performed by users of pre-upgrade application visible in
post-upgrade application
 Transactions performed by users of post-upgrade application visible in
pre-upgrade application
Old Edition
Pre-Upgrade
Cross-Edition
Triggers
Post-Upgrade
New Edition
Schema & Code
Changes
2
© 2010 Julian Dyke
juliandyke.com
Edition-Based Redefinition
Life Cycle
3

Pre-Upgrade
 Period before upgrade commences. Only one edition used by every
session

Upgrade
 Create a new edition
 Upgrade objects and code

Concurrent use of pre and post-upgrade edition
 Pre-upgrade session continue to use pre-upgrade sessions
 Changes made in new edition are not visible
 Cross-edition triggers propagate data changes made in old edition to new
edition and vice versa

Post Upgrade Phase
 When all pre-upgrade sessions have ended pre-upgrade edition can be
retired
 Post upgrade edition becomes default database edition
© 2010 Julian Dyke
juliandyke.com
Edition-Based Redefinition
Editions









Editions are non-schema object types
Every database has at least one edition
A new edition is the child of an existing edition
Every database session uses an edition
An edition is identified by a unique name
An object has an implicit edition name
 Only schema-qualified name is required
 Edition part is supplied automatically by database
Initial edition is called ORA$BASE
The edition used by a session is called the current edition
Can be changed for example:
ALTER SESSION SET EDITION = post_upgrade;

The default edition can be changed using:
ALTER DATABASE DEFAULT EDITION = post_upgrade;
4
© 2010 Julian Dyke
juliandyke.com
Edition-Based Redefinition
Editionable Objects
5

The following object types are editionable
 Synonyms
 Views
 PL/SQL objects
 Packages
 Procedures
 Functions

Tables and indexes are not editionable
© 2010 Julian Dyke
juliandyke.com
Edition-Based Redefinition
Example

Grant use of edition to users
CONNECT / AS SYSDBA
CREATE EDITION edition2 AS CHILD OF ORA$BASE;

Allow USER1 to work with editions
ALTER USER user1 ENABLE EDITIONS;

Allow USER1 to work with EDITION2
GRANT USE ON EDITION edition2 TO user1;

6
Note that an edition can only have one child
© 2010 Julian Dyke
juliandyke.com
Edition-Based Redefinition
Example
CONNECT user1/user1
CREATE OR REPLACE PROCEDURE hello IS
BEGIN
dbms_output.put_line ('Version 1');
END;
/
ALTER SESSION SET EDITION = edition2;
CREATE OR REPLACE PROCEDURE hello IS
BEGIN
dbms_output.put_line ('Version 2');
END;
/
ALTER SESSION SET EDITION = ORA$BASE;
EXECUTE hello;
'Version 1'
ALTER SESSION SET EDITION = edition2;
EXECUTE hello;
'Version 2'
7
© 2010 Julian Dyke
juliandyke.com
Edition-Based Redefinition
Editioning Views

Tables and indexes are non-editionable
 Due to amount of data
 Multiple copies across editions would consume too much space

Editioning views
 New type of view in Oracle 11.2 and above
 Logically presents different views of a table across different editions
 Use keyword EDITIONING during creation
 Can be associated with same types of triggers as base tables
CREATE OR REPLACE EDITIONING VIEW view1
AS SELECT * FROM t1;

To list editioning views
SELECT owner,view_name FROM dba_views
WHERE editioning_view = 'Y';
8
© 2010 Julian Dyke
juliandyke.com
Edition-Based Redefinition
Cross-Edition Triggers


9
Actual objects in the post-upgrade edition
Can be
 forward
 reverse

Forward cross-edition triggers
 Fired by application DML issued by sessions using pre-upgrade edition
 Transforms changes made to pre-upgrade columns into changes to postupgrade columns

Reverse cross-edition triggers
 Optional but recommended
 Fired by application DML issued by sessions using post-upgrade edition
 Transforms changes made to post-upgrade columns into changes to preupgrade columns
© 2010 Julian Dyke
juliandyke.com
Edition-Based Redefinition
Example

Create edition and grant privileges to USER1
CONNECT / AS SYSDBA
ALTER USER user1 ENABLE EDITIONS;
CREATE EDITION edition2;
GRANT USE ON EDITION edition2 TO user1;

Rename table
CONNECT user1/user1
ALTER TABLE driver RENAME TO driver_;

Create editioning view on table
CONNECT user1/user1
CREATE EDITIONING VIEW driver AS
SELECT
driver_key, driver_name, driver_dob, country_key
FROM driver_;
10
© 2010 Julian Dyke
juliandyke.com
Edition-Based Redefinition
Example

In new edition modify underlying table
CONNECT user1/user1
ALTER SESSION SET EDITION = edition2;
ALTER TABLE driver_ ADD driver_first_name VARCHAR2(30);
ALTER TABLE driver_ ADD driver_last_name VARCHAR2(30);

In new edition create new version of editioning view:
CONNECT user1/user1
CREATE OR REPLACE EDITIONING VIEW driver AS
SELECT
driver_key, driver_name, driver_dob, country_key,
driver_first_name,driver_last_name
FROM driver_;
11
© 2010 Julian Dyke
juliandyke.com
Edition-Based Redefinition
Example

In new edition create FORWARD trigger
ALTER SESSION SET EDITION = edition2;
CREATE OR REPLACE TRIGGER driver_forward
BEFORE INSERT OR UPDATE ON driver_
FOR EACH ROW
FORWARD CROSSEDITION
DISABLE
BEGIN
:new.driver_first_name := SUBSTR (:new.driver_name,1,INSTR (:new.driver_name,' '));
:new.driver_last_name := SUBSTR (:new.driver_name,INSTR (:new.driver_name,' ') + 1);
END;
/

In new edition enable FORWARD trigger
ALTER SESSION SET EDITION = edition2;
ALTER TRIGGER driver_forward ENABLE;
12
© 2010 Julian Dyke
juliandyke.com
Edition-Based Redefinition
Example

In new edition create REVERSE trigger
ALTER SESSION SET EDITION = edition2;
CREATE OR REPLACE TRIGGER driver_reverse
BEFORE INSERT OR UPDATE ON driver_
FOR EACH ROW
REVERSE CROSSEDITION
DISABLE
BEGIN
:new.driver_name := :new.driver_first_name||' '||:new.driver_last_name;
END;
/

In new edition enable REVERSE trigger
ALTER SESSION SET EDITION = edition2;
ALTER TRIGGER driver_reverse ENABLE;
13
© 2010 Julian Dyke
juliandyke.com
Edition-Based Redefinition
Example

In the new edition use the forward trigger to populate the values in the new
columns:
ALTER SESSION SET EDITION = edition2;
DECLARE
c NUMBER := dbms_sql.open_cursor ();
x NUMBER;
BEGIN
dbms_sql.parse
(
c => c,
language_flag => DBMS_SQL.NATIVE,
statement => 'UPDATE driver SET driver_key = driver_key',
apply_crossedition_trigger => 'DRIVER_FORWARD'
);
x := DBMS_SQL.EXECUTE (c);
DBMS_SQL.CLOSE_CURSOR (c);
END;
/
14
© 2010 Julian Dyke
juliandyke.com
Edition-Based Redefinition
Example

In the original edition insert a new row
ALTER SESSION SET EDITION = edition1;
INSERT INTO driver
(driver_key,driver_name,driver_dob,country_code)
VALUES ('JBUT','Jenson Button',NULL,'GBR');

In the new edition check that the cross edition trigger has fired
ALTER SESSION SET EDITION = edition2;
SELECT driver_first_name, driver_last_name
FROM driver
WHERE driver_key = 'JBUT';
DRIVER_FIRST_NAME
Jenson
15
© 2010 Julian Dyke
DRIVER_LAST_NAME
Button
juliandyke.com
Edition-Based Redefinition
Example

In the new edition insert a new row:
ALTER SESSION SET EDITION = edition2;
INSERT INTO driver
(driver_key,driver_first_name,driver_last_name,driver_dob,country_code)
VALUES ('JBUT','Jenson','Button',NULL,'GBR');

In the old edition check that the cross edition trigger has fired
ALTER SESSION SET EDITION = ORA$BASE;
SELECT driver_name
FROM driver
WHERE driver_key = 'JBUT';
DRIVER_NAME
Jenson Button
16
© 2010 Julian Dyke
juliandyke.com
Edition-Based Redefinition
Cross-Edition Triggers
17

Cross edition triggers may include FOLLOWS and PRECEDES clauses

FOLLOWS clause
 May be specified on a FORWARD cross-edition trigger or a non crossedition trigger
 Indicates trigger should be executed after a specified trigger
 If trigger B specifies trigger A in its FOLLOWS clause then trigger B
executes immediately after trigger A

PRECEDES clause
 May only be specified on a REVERSE cross-edition trigger
 Indicates trigger should be executed before a specified trigger
 If trigger B specifies trigger A in its PRECEDES clause then trigger A
executes immediately after trigger B
© 2010 Julian Dyke
juliandyke.com
Thank you for your interest
[email protected]
18
© 2010 Julian Dyke
juliandyke.com