Click here to load reader

Gérer les dépendances

  • View
    35

  • Download
    0

Embed Size (px)

DESCRIPTION

Gérer les dépendances. Objectifs. A la fin de ce chapitre, vous pourrez : effectuer le suivi des dépendances procédurales prédire les conséquences de la modification d'un objet de base de données sur des fonctions et des procédures stockées gérer des dépendances procédurales. - PowerPoint PPT Presentation

Text of Gérer les dépendances

<Lesson Title>Gérer les dépendances
Objectifs
effectuer le suivi des dépendances procédurales
prédire les conséquences de la modification d'un objet de base de données sur des fonctions et des procédures stockées
gérer des dépendances procédurales
But du chapitre
Ce chapitre décrit les dépendances d'objet, ainsi que la recompilation implicite et explicite d'objets non valides.
11-*
Comprendre les dépendances
Objets dépendants et référencés
Certains objets font référence à d'autres objets dans le cadre de leur définition. Ainsi, une procédure stockée pourra contenir une instruction SELECT chargée de sélectionner les colonnes d'une table. Dans ce cas, la procédure stockée est appelée objet dépendant, tandis que la table est qualifiée d'objet référencé.
Problèmes liés aux dépendances
Si vous modifiez la définition d'un objet référencé, il se peut que les objets dépendants ne fonctionnent plus correctement. Dans l'exemple de la diapositive, toute modification de la définition de la table peut entraîner une erreur de fonctionnement au niveau de la procédure.
Le serveur Oracle enregistre automatiquement les dépendances entre les objets. Pour permettre la gestion des dépendances, tous les objets du schéma disposent d'un état (VALID ou INVALID) enregistré dans le dictionnaire de données. La vue du dictionnaire de données USER_OBJECTS permet de visualiser cet état.
Etat
Sens
VALID
L'objet de schéma a été compilé et peut être utilisé immédiatement lorsqu'il est référencé.
INVALID
L'objet de schéma doit être compilé avant de pouvoir être utilisé.
11-*
Dépendances
Dépendante
Référencée
Dépendante
Référencée
xxxxxxxxxxxxxx
vvvvvvvvvvvvvv
xxxxxxxxxxxxxx
vvvvvvvvvvvvvv
xxxxxxxxxxxxxx
vvvvvvvvvvvvvv
xxxxxxxxxxxxxx
vvvvvvvvvvvvvv
xxxxxxxxxxxxxx
vvvvvvvvvvvvvv
Procédure
Objets dépendants et objets référencés (suite)
Une procédure ou une fonction peut référencer de manière directe ou indirecte (par l'intermédiaire d'une vue, d'une procédure, d'une fonction, d'une procédure de package ou d'une fonction de package) les objets suivants :
tables
vues
séquences
procédures
fonctions
11-*
Dépendances locales
Gérer les dépendances locales
Dans le cas des dépendances locales, les objets sont situés sur le même noeud dans la même base de données. Le serveur Oracle gère automatiquement toutes les dépendances locales à l'aide de la table des dépendances internes (depends-on table) de la base de données. Lorsqu'un objet référencé est modifié, les objets dépendants sont invalidés. Lors de l'appel suivant de l'objet invalidé, le serveur Oracle le recompile automatiquement.
11-*
Dépendances locales
INVALID
INVALID
INVALID
Le serveur Oracle recompile implicitement tout objet INVALID lorsque ce dernier est de nouveau appelé
xxxxxxxxxxxxxx
vvvvvvvvvvvvvv
xxxxxxxxxxxxxx
vvvvvvvvvvvvvv
xxxxxxxxxxxxxx
vvvvvvvvvvvvvv
vvvvvvvvvvvvvv
vvvvvvvvvvvvvv
xxxxxxxxxxxxxx
vvvvvvvvvvvvvv
xxxxxxxxxxxxxx
vvvvvvvvvvvvvv
xxxxxxxxxxxxxx
vvvvvvvvvvvvvv
Gérer les dépendances locales (suite)
Supposons qu'il y ait une modification de la structure de la table sur laquelle une vue est basée. Lorsque vous décrivez la vue à l'aide de la commande iSQL*Plus DESCRIBE, vous recevez un message d'erreur indiquant que l'objet ne peut pas être décrit en raison de son caractère non valide. La raison en est simple : la commande en question n'est pas une commande SQL et, à ce stade, la vue n'est pas valide car la structure de sa table de base a changé. Si vous interrogez la vue à présent,
celle-ci est recompilée automatiquement et affiche un résultat en cas de succès.
11-*
Scénario de dépendances locales
La procédure QUERY_EMP référence directement la table EMPLOYEES. La procédure ADD_EMP met à jour indirectement la table EMPLOYEES, à l'aide de la vue EMP_VW.
Dans chacun des cas ci-dessous, la procédure ADD_EMP sera-t-elle invalidée ? Sera-t-elle recompilée avec succès ?
1. La logique interne de la procédure QUERY_EMP est modifiée.
2. Une nouvelle colonne est ajoutée à la table EMPLOYEES.
3. La vue EMP_VW est supprimée.
11-*
SELECT name, type, referenced_name, referenced_type
FROM user_dependencies
Afficher les dépendances directes en utilisant USER_DEPENDENCIES
Définissez les objets de base de données à recompiler manuellement en affichant les dépendances directes à partir de la vue du dictionnaire de données USER_DEPENDENCIES.
Examinez les vues ALL_DEPENDENCIES et DBA_DEPENDENCIES ; chacune d'elles contient une colonne supplémentaire, OWNER, référençant le propriétaire de l'objet.
Colonne
Type de l'objet dépendant (PROCEDURE, FUNCTION, PACKAGE, PACKAGE BODY, TRIGGER ou VIEW)
REFERENCED_OWNER
Lien de base de données permettant d'accéder à l'objet référencé
11-*
Afficher les dépendances directes et indirectes
1. Exécuter le script utldtree.sql pour créer les objets permettant d'afficher les dépendances directes et indirectes
2. Exécuter la procédure DEPTREE_FILL
EXECUTE deptree_fill('TABLE','SCOTT','EMPLOYEES')
Afficher les dépendances directes et indirectes à l'aide des vues fournies par Oracle
DEPTREE et IDEPTREE sont des vues utilisateur supplémentaires fournies par Oracle, qui permettent d'afficher les dépendances directes et indirectes.
Exemple
1. Assurez-vous que le script utldtree.sql s'est correctement exécuté. Il se trouve dans le dossier $ORACLE_HOME/rdbms/admin. (Il est fourni dans le dossier lab des fichiers de cours.)
2. Entrez dans la table DEPTREE_TEMPTAB les informations relatives à un objet référencé particulier en appelant, à cette fin, la procédure DEPTREE_FILL. Cette procédure admet trois paramètres :
object_type
object_owner
object_name
11-*
Afficher les dépendances
Exemple
Affichez une représentation sous forme de tableau de tous les objets dépendants en interrogeant la vue DEPTREE.
Affichez une représentation avec indentation de ces mêmes informations en interrogeant la vue IDEPTREE. Cette dernière se compose d'une seule colonne nommée DEPENDENCIES.
Par exemple,
FROM ideptree;
fournit une seule colonne de résultats avec indentation qui présente les dépendances sous forme de structure hiérarchique.
11-*
Autre scénario de dépendances locales
Table EMPLOYEES
Exemple 1
Prévoyez les effets induits par une modification de la définition d'une procédure sur la recompilation d'une procédure dépendante.
Supposons que la procédure RAISE_SAL mette à jour directement la table EMPLOYEES, et que la procédure REDUCE_SAL mette à jour indirectement la table EMPLOYEES à l'aide de RAISE_SAL.
Dans chacun des cas suivants, la procédure REDUCE_SAL sera-t-elle recompilée avec succès ?
1. La logique interne de la procédure RAISE_SAL est modifiée.
2. L'un des paramètres formels de la procédure RAISE_SAL est éliminé.
11-*
Scénario de dépendances de résolution de noms locale
QUERY_EMP
procédure
Prévoir les effets des modifications sur les objets dépendants (suite)
Exemple 2
Il est un cas où la création d'une table, d'une vue ou d'un synonyme peut invalider de façon imprévisible un objet dépendant parce qu'il perturbe la hiérarchie du serveur Oracle en ce qui concerne la résolution des références de nom.
Prévoyez l'effet qu'aura le nom d'un nouvel objet sur une procédure dépendante.
Supposons que la procédure QUERY_EMP référençait initialement un synonyme public nommé EMPLOYEES. Cependant, vous venez de créer une table EMPLOYEES dans votre propre schéma. Cette modification invalidera-t-elle la procédure ? Lequel des deux objets EMPLOYEES la procédure QUERY_EMP référencera-t-elle après sa recompilation ?
Supposons maintenant que vous supprimiez la table privée EMPLOYEES. Cela invalidera-t-il la procédure ? Que se passera-t-il lors de la recompilation de la procédure ?
Vous pouvez effectuer le suivi des dépendances de sécurité dans la vue du dictionnaire de données USER_TAB_PRIVS.
11-*
Comprendre les dépendances distantes
Comprendre les dépendances distantes
Dans le cas des dépendances distantes, les objets sont situés sur des noeuds différents. En ce qui concerne les dépendances entre les objets de schéma distants, le serveur Oracle gère uniquement les dépendances de type "procédure locale vers procédure distante" (y compris les fonctions, les packages et les déclencheurs). La procédure stockée locale et tous les objets dépendants seront invalidés, mais ne seront pas recompilés automatiquement lors du premier appel les concernant.
11-*
Comprendre les dépendances distantes
Recompilation des objets dépendants : locaux et distants
Assurez-vous que la recompilation explicite des procédures dépendantes distantes et la recompilation implicite des procédures dépendantes locales se sont déroulées avec succès. Pour ce faire, vérifiez l'état des procédures dans la vue USER_OBJECTS.
Si la recompilation implicite et automatique des procédures dépendantes locales s'avère infructueuse, l'état reste non valide et le serveur Oracle renvoie une erreur lors de l'exécution. Aussi, pour éviter toute interruption de la production, est-il vivement conseillé de recompiler manuellement les objets dépendants locaux, plutôt que de recourir à un mécanisme automatique.
11-*
Concepts des dépendances distantes
choisi par l'utilisateur :
vérification d'horodatage (TIMESTAMP)
Vérification d'horodatage (TIMESTAMP)
Chaque programme PL/SQL comporte un horodatage défini lors de sa phase de création ou de recompilation. Lorsque vous modifiez un programme PL/SQL ou un objet de schéma associé, tous les programmes dépendants sont marqués comme étant non valides et doivent être recompilés avant de pouvoir s'exécuter. La comparaison d'horodatage effective a lieu lorsqu'une instruction figurant dans le corps d'une procédure locale appelle une procédure distante.
Vérification de signature (SIGNATURE)
La date, l'heure et la signature sont enregistrées pour chaque programme PL/SQL. La signature d'une structure PL/SQL contient des informations sur les éléments suivants :
le nom de la structure (procédure, fonction, package),
les types de base des paramètres de la structure,
les modes des paramètres (IN, OUT ou IN OUT),
le nombre des paramètres.
L'horodatage du programme appelant est comparé à celui du programme distant appelé. Si les valeurs correspondent, l'appel s'effectue normalement. Dans le cas contraire, la couche des appels RPC (Remote Procedure Call) effectue un test simple visant à comparer la signature et à déterminer si l'appel est sécurisé ou non. Si la signature n'a subi aucune modification de nature à affecter sa compatibilité, l'exécution se poursuit ; dans le cas contraire, une erreur est renvoyée.
11-*
Paramètre REMOTE_DEPENDENCIES_MODE
Définir REMOTE_DEPENDENCIES_MODE :
REMOTE_DEPENDENCIES_MODE = value
Définir le paramètre REMOTE_DEPENDENCIES_MODE
11-*
Dépendances distantes
et horodatage
Utilisation de l'horodatage pour la recompilation automatique des objets locaux et distants
Si des valeurs d'horodatage sont utilisées pour traiter les dépendances entre des programmes PL/SQL, chaque fois que vous modifiez un programme ou un objet de schéma associé, tous les programmes dépendants sont marqués comme étant non valides et doivent être recompilés avant de pouvoir s'exécuter.
11-*
Dépendances distantes
et horodatage
Utilisation de l'horodatage pour la recompilation automatique des objets locaux et distants
Dans l'exemple présenté sur la diapositive, la définition de la table est modifiée. Par conséquent, tous les programmes dépendants sont marqués comme étant non valides et doivent être recompilés avant de pouvoir s'exécuter.
En cas de modification d'objets distants, il est vivement conseillé de recompiler manuellement les objets dépendants locaux pour éviter toute interruption de la production.
Le mécanisme de dépendance distante est différent du mécanisme local décrit précédemment. La première fois qu'un sous-programme distant recompilé est appelé par un sous-programme local, le système renvoie une erreur lors de l'exécution et le sous-programme local est invalidé ; lors de l'appel suivant, une recompilation implicite est effectuée automatiquement.
11-*
Compilation de la procédure distante B
à 8H00
Procédures locales référençant des procédures distantes
Le serveur Oracle invalidera toute procédure locale référençant une procédure distante si la recompilation de cette dernière est postérieure à la compilation de la procédure locale.
Mécanisme de dépendance distante automatique
Lors de la compilation d'une procédure, le serveur Oracle enregistre les valeurs d'horodatage de la compilation dans le pseudo-code de la procédure.
Sur la diapositive, lorsque la procédure distante B est correctement compilée à 8h00, cette heure est enregistrée comme valeur d'horodatage.
11-*
Compilation de la procédure locale A
à 9H00
Mécanisme de dépendance distante automatique
Lors de la compilation d'une procédure locale faisant référence à une procédure distante, le serveur Oracle enregistre également l'horodatage de la procédure distante dans le pseudo-code de la procédure locale.
Sur la diapositive, la procédure locale A, qui est dépendante de la procédure distante B, est compilée à 9H00. Les valeurs d'horodatage de la procédure locale A et de la procédure distante B sont enregistrées dans le pseudo-code de la procédure A.
11-*
Exécution de la procédure A
Procédure locale A
Dépendance distante automatique
Lorsque la procédure locale est appelée, le serveur Oracle compare lors de l'exécution les deux valeurs d'horodatage de la procédure distante référencée.
Si ces valeurs sont identiques (indiquant ainsi que la procédure distante n'a pas été recompilée), le serveur Oracle exécute la procédure locale.
Dans l'exemple présenté sur la diapositive, l'horodatage enregistré dans le pseudo-code de la procédure distante B est identique à celui enregistré dans la procédure locale A. Par conséquent, la procédure locale A est valide.
11-*
Recompilation de la procédure distante B à 11H00
Valide
Procédures locales référençant des procédures distantes
Supposons que la recompilation de la procédure distante B se soit correctement effectuée à 11H00. Sa nouvelle valeur d'horodatage est enregistrée dans le pseudo-code.
11-*
Exécution de la procédure A
Procédure locale A
Dépendance distante automatique
Si les valeurs d'horodatage sont différentes (indiquant ainsi que la procédure distante a été recompilée), le serveur Oracle invalide la procédure locale et renvoie une erreur lors de l'exécution.
Si la procédure locale, désormais marquée comme étant non valide, est appelée une seconde fois, le serveur Oracle la recompile avant de l'exécuter, conformément au mécanisme de dépendance locale automatique.
Remarque : Si une procédure locale renvoie une erreur lors de l'exécution la première fois qu'elle est appelée (indiquant ainsi une modification de l'horodatage de la procédure distante), il convient de mettre au point une stratégie permettant d'appeler à nouveau la procédure locale.
Dans l'exemple présenté sur la diapositive, la procédure distante est recompilée à 11H00. Cette heure est enregistrée en tant que valeur d'horodatage dans le pseudo-code. Le pseudo-code de la procédure locale A indique toujours 8H00 comme valeur d'horodatage pour la procédure distante B.
L'horodatage enregistré dans le pseudo-code de la procédure locale A diffère de celui enregistré dans la procédure distante B. Par conséquent, la procédure locale est marquée comme étant non valide. Lorsque la procédure locale est appelée pour la seconde fois, elle est correctement compilée et est marquée comme étant valide.
Inconvénients liés à l'horodatage
L'horodatage a pour inconvénient d'être un mode trop rigide. La recompilation d'objets dépendants sur le réseau s'effectue souvent alors qu'elle n'est pas strictement nécessaire, ce qui entraîne une dégradation des performances.
11-*
Mode signature
les types de données des paramètres
les modes des paramètres
La signature de la procédure distante est enregistrée dans la procédure locale.
Lors de l'exécution d'une procédure dépendante, la signature de la procédure distante référencée est comparée.
Signatures
Le mode signature vous permet d'atténuer certains problèmes associés au modèle de dépendance basé uniquement sur l'horodatage. Il permet de recompiler la procédure distante sans affecter les procédures locales, ce qui revêt une importance toute particulière si la base de données est distribuée.
La signature d'un sous-programme contient les informations suivantes :
le nom du sous-programme,
les modes des paramètres,
le nombre des paramètres,
le type de données de la valeur renvoyée pour une fonction.
Si un programme distant est modifié et recompilé, et si la signature ne subit aucun changement, la procédure locale pourra exécuter la procédure distante. En mode horodatage, une erreur aurait été générée du fait de la non-correspondance des valeurs d'horodatage.
11-*
Recompilation
La recompilation :
est traitée automatiquement par le biais d'une recompilation implicite lors de l'exécution
est traitée par le biais d'une recompilation explicite avec l'instruction ALTER
ALTER PROCEDURE [SCHEMA.]procedure_name COMPILE;
ALTER FUNCTION [SCHEMA.]function_name COMPILE;
ALTER PACKAGE [SCHEMA.]package_name COMPILE [PACKAGE];
ALTER PACKAGE [SCHEMA.]package_name COMPILE BODY;
ALTER TRIGGER trigger_name [COMPILE[DEBUG]];
Recompilation d'objets PL/SQL
Si la recompilation aboutit, l'objet devient valide. Sinon, le serveur Oracle renvoie une erreur et l'objet reste non valide.
Lorsque vous recompilez un objet PL/SQL, le serveur Oracle commence par recompiler tous les objets invalides dont il dépend.
Procédure
Tout objet local dépendant d'une procédure sera également invalidé (procédures qui appellent la procédure compilée ou corps de package qui définissent les procédures appelant la procédure recompilée, par exemple).
Packages
L'option COMPILE PACKAGE recompile la spécification et le corps du package, qu'il soit valide ou non. Quant à l'option COMPILE BODY, elle recompile uniquement le corps du package.
La recompilation d'une spécification de package invalide tout objet local dépendant de la spécification ; c'est le cas par exemple des procédures appelant d'autres procédures ou fonctions du package. Notez que le corps d'un package dépend également de sa spécification.
11-*
Recompilation d'un programme PL/SQL
est traitée automatiquement par le biais d'une recompilation implicite lors de l'exécution
est traitée par le biais d'une recompilation explicite avec l'instruction ALTER
ALTER PROCEDURE [SCHEMA.]procedure_name COMPILE;
ALTER FUNCTION [SCHEMA.]function_name COMPILE;
ALTER PACKAGE [SCHEMA.]package_name COMPILE [PACKAGE];
ALTER PACKAGE [SCHEMA.]package_name COMPILE BODY;
ALTER TRIGGER trigger_name [COMPILE[DEBUG]];
Recompilation d'objets PL/SQL (suite)
Déclencheurs
La recompilation explicite évite la recompilation implicite lors de l'exécution et les erreurs de compilation associées, tout en empêchant une réduction des performances.
L'option de débogage (DEBUG) indique au compilateur PL/SQL de générer et de stocker le code utilisé par le programme de débogage PL/SQL.
11-*
Echec de la recompilation
dépendantes échouera dans les cas suivants :
l'objet référencé a été supprimé ou renommé
le type de données de la colonne référencée a été modifié
la colonne référencée a été supprimée
une vue référencée a été remplacée par une vue avec des colonnes différentes
la liste des paramètres d'une procédure référencée a été modifiée
Echec de la recompilation
Il arrive que la recompilation des procédures dépendantes n'aboutisse pas ; c'est le cas lorsqu'une table référencée est supprimée ou renommée.
Le succès d'une recompilation repose sur une dépendance parfaite. Si une vue référencée est recréée, tout objet dépendant devra être recompilé. Le succès de la recompilation dépend des colonnes présentes dans la vue, ainsi que des colonnes dont les objets dépendants ont besoin pour leur exécution. Si les colonnes requises ne font pas partie de la nouvelle vue, l'objet restera non valide.
11-*
Recompilation réussie
dépendantes réussira dans les cas suivants :
la table référencée comporte de nouvelles colonnes
le type de données des colonnes référencées n'a pas été modifié
une table privée a été supprimée, mais il existe une table publique avec les mêmes nom et structure
le corps PL/SQL d'une procédure référencée a été modifié et recompilé avec succès
Recompilation réussie
de nouvelles colonnes sont ajoutées à une table référencée,
toutes les instructions INSERT contiennent une liste de colonnes,
aucune nouvelle colonne n'est définie comme étant NOT NULL.
En cas de suppression d'une table privée référencée par une procédure dépendante, l'état de la procédure dépendante devient non valide. Si la procédure est recompilée, soit explicitement, soit implicitement, et s'il existe une table publique, la compilation pourra réussir, mais la procédure deviendra dépendante de la table publique. La recompilation aboutira uniquement si la table publique contient les colonnes dont la procédure a besoin ; dans le cas contraire, l'état de la procédure restera non valide.
11-*
Recompilation des procédures
infructueuses en :
effectuant des interrogations à l'aide de la notation SELECT *
ajoutant une liste de colonnes aux instructions INSERT
Recompilation des procédures
Vous pouvez réduire le nombre des échecs de recompilation en suivant les règles présentées sur la diapositive.
11-*
Packages et dépendances
Gestion des dépendances
Vous pouvez simplifier considérablement la gestion des dépendances associée aux packages lorsque vous référencez une fonction ou une procédure de package depuis une fonction ou une procédure autonome :
Si le corps du package est modifié mais pas sa spécification, la procédure autonome qui référence la structure du package reste valide.
Si la spécification du package est modifiée, la procédure externe qui référence une structure de package est invalidée, au même titre que le corps du package.
11-*
Packages et dépendances
Gestion des dépendances (suite)
Si une procédure autonome référencée dans le package est modifiée, tout le corps du package est invalidé ; cependant, sa spécification reste valide. Par conséquent, il est vivement conseillé d'intégrer la procédure au package.
11-*
Synthèse
effectuer le suivi des procédures dépendantes
recompiler les procédures manuellement dès que possible après la modification de la définition d'un objet de base de données
Synthèse du chapitre
Pour éviter toute interruption de la production, effectuez le suivi des procédures dépendantes et recompilez-les manuellement, dès que possible, après la modification de la définition d'un objet de base de données.
Situation
La procédure dépend d'un objet local
Oui, lors de la première réexécution
La procédure dépend d'une procédure distante
Oui, mais lors de la seconde réexécution ; effectuez une recompilation manuelle lors de la première réexécution, ou appelez-la une seconde fois
La procédure dépend d'un objet distant autre qu'une procédure
Non
11-*
Présentation de l'exercice 11
utiliser DEPTREE_FILL et IDEPTREE pour visualiser les dépendances
recompiler des procédures, des fonctions et des packages
Présentation de l'exercice 11
Dans cet exercice, vous allez utiliser la procédure…

Search related