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
oualter 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 dansDBA_OBJECTS
, vous vous apercevrez que toutes les éditions sont la propriété de l’utilisateurSYS
, 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 dansDBA_TAB_PRIVS
que le privilègeUSE 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
etDBA_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, interrogezUSER_OBJECTS_AE
,ALL_OBJECTS_AE
ouDBA_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!