Oracle 11g Release 2, un premier exemple d'utilisation des Editions

Les « Editions » sont une nouvelle fonctionnalité d’Oracle 11.2. Elles permettent de gérer simultanément, dans la même base de données, plusieurs objets identiques. Vous avez peut-être déjà été alerté par ces changements en 11.1 si vous avez regardé, comme Alex Fatkulin, certaines vues comme DBA_OBJECTS.  Dans ce qui suit, je vous propose de partager quelques tests simples pour illustrer le fonctionnement des éditions.

Note:
Pour une vue complète de cette fonctionnalité, reportez-vous au Chapitre 19 Edition-Based Redefinition de « Advanced Application Developer’s Guide, 11g Release 2 (11.2) »

L’exemple

Pour éviter toute confusion, commençons par noter que les éditions ne s’appliquent qu’aux vues, synonymes et la plupart des objets PL/SQL comme les packages, les procédures, les fonctions, les « libraries » et les triggers (sauf s’ils sont inter-éditions). Les tables, indices ou autres vues matérialisées ne peuvent pas faire l’objet d’éditions.Quelques remarques avant de commencer:

  • Pour qu’un utilisateur puisse utiliser des éditions, il faut lui activer cette possibilité avec create user ... enable editions ou alter user ... enable editions. Cette opération est irréversible ;
  • Pour qu’un utilisateur puisse créer une édition, il faut lui donner le privilège CREATE ANY EDITION. En effet, si vous regardez dans DBA_OBJECTS, vous vous apercevrez que toutes les éditions sont la propriété de l’utilisateur SYS, même si vous les créez avec un autre utilisateur.
  • Si vous créez une édition avec un autre utilisateur que SYS, vous constaterez dans DBA_TAB_PRIVS que le privilège USE ON EDITION X est implicitement donné à l’utilisateur qui crée l’édition
  • Il y a une notion de hiérarchie entre les éditions et pour l’instant il n’est pas possible d’avoir plusieurs fils pour une édition (une idée pour la version 12.1!); lorsque vous activez une édition, vous continuez à voir les objets des éditions parentes, à moins que vous ne modifiez l’objet dans l’édition en cours.
  • Les vues USER_OBJECTS, ALL_OBJECTS et DBA_OBJECTS ne présentent que les objets de l’utilisateur pour l’édition active. Si vous avez 2 procédures dans 2 éditions distinctes pour un utilisateur, si vous interrogez ces vues, vous ne verrez qu’une seule fois la procédure. Pour voir toutes les éditions, interrogez USER_OBJECTS_AE, ALL_OBJECTS_AE ou DBA_OBJECTS_AE
  • Les éditions permettent non seulement de modifier un objet mais aussi de le supprimer avec la commande DROP

Ci-dessous un exemple d’utilisation avec des erreurs volontaires pour illustrer le fonctionnement et quelques limites des éditions; il présente l’utilisation de plusieurs éditions d’une même procédure:

-- Crée l'utilisateur
-- et donne les privilèges
-- adéquats
create user demo
   identified by demo
   default tablespace users
   temporary tablespace temp
   enable editions;
grant connect, resource to demo;
grant create any edition to demo;
-- Crée la procédure X
-- dans l'édition ORA$BASE
connect demo/demo
create or replace procedure X is
begin
    dbms_output.put_line('Helo');
end;
/
col object_name format a11
col object_type format a11
col edition_name format a12
select object_name, object_type, edition_name
  from user_objects;
OBJECT_NAME OBJECT_TYPE EDITION_NAME
----------- ----------- ------------
X           PROCEDURE   ORA$BASE
-- Crée et active une
-- nouvelle édition
create edition v2;
alter session set edition=v2;
col owner format a5
col table_name format a10
col privilege format a9
col grantee format a7
select OWNER, TABLE_NAME, PRIVILEGE, GRANTEE
  from user_tab_privs;
OWNER TABLE_NAME PRIVILEGE GRANTEE
----- ---------- --------- -------
SYS   V2         USE       DEMO
-- Modifie la procédure X
-- dans la nouvelle édition
create or replace procedure X is
begin
    dbms_output.put_line('Hello');
end;
/
-- Vérifie qu'en fonction de l'édition
-- le code est différent
set serveroutput on
exec X
Hello
select OBJECT_NAME, OBJECT_TYPE, EDITION_NAME
  from user_objects
 where object_name='X'
   and object_type='PROCEDURE';
OBJECT_NAME OBJECT_TYPE EDITION_NAME
----------- ----------- ------------
X	    PROCEDURE	V2
alter session set edition=ora$base;
set serveroutput on
exec X
Helo
select OBJECT_NAME, OBJECT_TYPE, EDITION_NAME
  from user_objects
 where object_name='X'
   and object_type='PROCEDURE';
OBJECT_NAME OBJECT_TYPE EDITION_NAME
----------- ----------- ------------
X	    PROCEDURE	ORA$BASE
-- Crée une nouvelle édition
alter session set edition=ora$base;
create edition v3;
*
ERROR at line 1:
ORA-38807: Implementation restriction: an edition can have only one child
create edition v3 as child of v2;
alter session set edition=v3;
-- Drop la procédure et constate
-- que les changements n'ont lieu
-- que dans l'edition active
drop procedure X;
desc X
ERROR:
ORA-04043: object X does not exist
alter session set edition=v2;
desc X
PROCEDURE X
col object_name format a11
col object_type format a11
col edition_name format a12
select OBJECT_NAME, OBJECT_TYPE, EDITION_NAME
  from user_objects_ae
 where object_name='X'
   and object_type='PROCEDURE';
OBJECT_NAME OBJECT_TYPE EDITION_NAME
----------- ----------- ------------
X           PROCEDURE   ORA$BASE
X           PROCEDURE   V2
-- Supprime les éditions et les objets
-- associés
connect / as sysdba
drop edition v2;
*
ERROR at line 1:
ORA-38810: Implementation restriction: cannot drop edition that has a parent
and a child
drop edition v3 cascade;
Edition dropped.
drop edition v2 cascade;
Edition dropped.
-- Supprime l'utilisateur
drop user demo cascade;

Conclusion

Comme vous l’aurez noté, il s’agit d’une première prise en main des éditions; baser la mise à jour d’une application avec 0 indisponibilité ou presque sur les éditions peut s’avérer bien plus compliqué. Par exemple, vous pouvez être amener lors de cette opération à découper une table en plusieurs tables d’une version N de votre application à une version N+1 et à utiliser DBMS_REDEFINITION, Streams, ainsi que des triggers inter-éditions. Néanmoins, le champ d’application de cette fonctionnalité est vraiment phénoménal et il nous tarde de mettre ça en œuvre sur des projets critiques. Vous comprendrez que d’ici là, on en garde sous le coude pour nos clients. Qui sait, peut-être que dans quelques semaines quand nous auront épuisés les autres sujets nous reviendrons avec des choses plus consistantes.
Dans, l’intervalle nous vous donnons rendez-vous pour aborder bien d’autres sujets à propos d’Oracle 11.2 ! Restez connecté et, si ce n’est pas encore le cas, et abonnez-vous tout de suite au blog Easyteam par E-Mail, Twitter et RSS!