TP Contraintes - Triggers 1. Préambule Oracle est accessible sur le serveur Venus et vous êtes autorisés à accéder à une instance licence. Vous utiliserez l interface d accés SQL*Plus qui permet l exécution de commandes spécifiques et de commandes SQL. Pour vous connecter sqlplus /@venus/licence Remarque : Quelques commandes SQL*Plus : SET pause ON/OFF défilement page par page SET LINESIZE n fixe le nbre de caractéres de la ligne SET PAGESIZE n fixe le nbre de lignes par page DESC nomtable description de la table L administration d une base de données sous Oracle se fait à l aide d une base de données appelée métabase (on parle aussi de dictionnaire de données). Vous pourrez consulter les éléments de cette métabase : USER tables, USER tab columns, USER constraints. 2. Entreprise Vous disposez d un fichier Creation.sql contenant un script de création d une base de données Entreprise que vous sauvegarderez dans un répertoire de travail. Le schéma initial comporte les schémas relationnels suivants : EMP (nom, num, fonction, n sup, embauche, salaire, comm, n dept) un employé de numéro num posséde un nom et occupe l emploi fonction, cet employé a aussi un responsable identifié par le numéro n sup, une date d embauche embauche, un salaire, une commission comm et un département de rattachement n dept DEPT(n dept, nom,lieu) un Département de numéro n dept, de nom nom est situé à lieu Créer la base (en exécutant le script par la commande start ou @) et vérifier le contenu des tables créées. 1
GLIN605 Info 2011-2012 2 2.1 Requêtes Vous effectuerez en algèbre relationnelle (lorsque cela est possible) puis en SQL les requêtes suivantes : Liste des nom d employés ayant une commission, classée par commission décroissante. Donner le nom des employés classés par fonction, et pour chaque fonction classés par salaire décroissant. Nom des personnes embauchées depuis le 1 janvier 2001. Donner pour chaque employé son nom et son lieu de travail. Donner pour chaque employé le nom de son supérieur hiérarchique. Quels sont les employés gagnant plus que tous les employés du département 30. Quels sont les employés ne travaillant pas dans le même département que leur supérieur hiérarchique. Donner le nom, la fonction et le salaire de l employé (ou des employés) ayant le salaire le plus élevé. Total des salaires pour chaque département. Quel est le département ayant le plus d employés? Nom des départements ayant des employés effectuant toutes les fonctions. 2.2 Définition des Contraintes Lorsque certaines contraintes sont introduites dans la conception du schéma, le systéme leur donne un nom interne, vérifiez le en consultant la table du dictionnaire de données USER constraints. Ici le schéma initial ne comporte aucune contrainte et le concepteur constate qu il a omis de déclarer des contraintes d intégrité essentielles. Il s agit donc de mettre en œuvre ces contraintes en les créant et en les nommant (consulter l aide ALTER et ADD CONSTRAINT). Sur la table DEPT rajouter la contrainte dept pk définissant n dept comme clé primaire. Sur la table EMP rajouter les contraintes suivantes : 1. emp pk définissant num comme clé primaire, 2. nom u définissant nom comme nom unique, 3. responsable définissant n sup comme Foreign key référençant num (CI intra table) 4. dept définissant n dept comme Foreign key référençant n dept de la table DEPT (CI inter table) 5. commission définissant un contrôle tel que seuls les employés dont la fonction est commercial aient une commission comm non nulle (null).
GLIN605 Info 2011-2012 3 2.3 Vérification Vérifier que les contraintes ont été créées. Pour cela consulter la table de la métabase USER constraints. Remarquer que la valeur de de constraint type est C, P, U ou R suivant que la contrainte est respectivement de type CHECK, PRIMARY KET, UNIQUE, FOREIGN KEY. Vérifier que ces contraintes sont actives en essayant de les transgresser en réalisant des insertions ou des effacements (donner un exemple de transgression). Remarque : Tout ordre sql s effectue en fait au sein d une transaction. Toute transaction peut être validée par l ordre commit ou annulée par l ordre rollback. 2.4 Désactiver/Activer des Contraintes Dans certains cas, l administrateur ou l utilisateur qui a défini une contrainte peut souhaiter, pour effectuer des mises à jour qui la transgresse, désactiver momentanément cette contrainte. 1. consulter l aide DISABLE/ENABLE ; 2. désactiver la contrainte commission ; 3. insérer des n-uplets dans EMP transgressant la contrainte commission ; 4. essayer de rétablir la contrainte. Conclusion? ; 5. détecter les n-uplets qui provoquent l erreur afin de pouvoir les supprimer et rétablir la contrainte. Pour cela, créer une table que vous nommez par exemple REJETS : CREATE TABLE REJETS (ROW_ID ROWID, OWNER VARCHAR2(30), TABLE_NAME VARCHAR2(30), CONSTRAINT VARCHAR2(30)); Réactiver la contrainte commission en demandant la sauvegarde des n- uplets erreurs dans la table REJETS par la commande alter table EMP enable constraint commission exceptions into REJETS Vérifier le contenu de la table REJETS, puis supprimer de la table EMP les n-uplets erreurs. Rétablissez enfin la contrainte commission 2.5 Suppression des contraintes Supprimer les contraintes de la table EMP.
GLIN605 Info 2011-2012 4 3. PL/SQL et triggers PL/SQL est le langage procédural d Oracle et permet de mélanger SQL et langage procédural dans un même traitement. Les traitements PL/SQL peuvent être exécutés, soit directement par Oracle (blocs anonymes), soit à partir d objets de la base (procédures stockées et Packages). Nous allons successivement découvrir les notions classiques de programmes, procédures, fonctions...puis la notion de trigger de base de données (alerteurs ou déclencheurs). Un bloc PL/SQL peut Ítre considéré comme un programme. Consulter l aide. Vous pouvez donc créer des fichiers comportant un bloc PL/SQL qui seront ensuite chargés et exécutés. Syntaxe d un bloc DECLARE -- declarations des variables, constantes, exceptions et curseurs BEGIN [nom bloc] -- statements (instructions SQL, PL/SQL) EXCEPTION -- handlers traitement des erreurs END [nom bloc]; 3.1 Remarques commentaire sur la ligne /*... */ commentaires plusieurs lignes Tout bloc PL/SQL doit se terminer par une ligne ne comportant q un. (on peut aussi utiliser / mais la vérification du code est alors suivie d une exécution immédiate). La compilation des blocs se fait lors de son chargement (@nomfichier ou STARTnomfichier). Le texte de tout bloc PL/SQL est visible par la commande LIST Si des erreurs sont détectées vous pouvez les visualiser par la commande SHOW ERRORS Consulter le dictionnaire des données. USER_Objects Plusieurs packages prédéfinis existent, vous utiliserez le DBMS OUTPUT package qui fournit les méthodes d écriture des diverses variables sur le périphérique de sortie standard. PROCEDURE PUT(A VARCHAR2) PROCEDURE PUT(A NUMBER)
GLIN605 Info 2011-2012 5 PROCEDURE PUT(A DATE) PROCEDURE PUT_LINE(A VARCHAR2) PROCEDURE PUT_LINE(A NUMBER) PROCEDURE PUT_LINE(A DATE) avec possibilité de concaténation entre diverses variables par Attention les procédures du package DBMS OUTPUT ne fonctionnent avec effet visible qu après la commande d environnement SET SERVEROUTPUT ON 3.2 Triggers Un déclencheur ou trigger est un bloc PL/SQL associé à une table et qui s exécute lorsqu une instruction (Insert, Update, Delete) sera demandée sur la table. CREATE [OR REPLACE] TRIGGER [schema.]trigger {BEFORE AFTER} {DELETE INSERT UPDATE [OF column [, column]...]} [OR {DELETE INSERT UPDATE [OF column [, column]...]}]... ON [schema.]table [ [REFERENCING { OLD [AS] old [NEW [AS] new] NEW [AS] new [OLD [AS] old] } ] FOR EACH ROW [WHEN (condition)] ] pl/sql_block Il s agit donc de mettre en œuvre quelques triggers afin d assurer divers contrôles. Il est conseillé d écrire le code des triggers dans un fichier que vous créerez avec l éditeur de votre choix. a) Création d un alerteur On souhaite avoir un message Opération terminée après toute insertion, modification ou suppression effectuée sur la table EMP. Créer le trigger alert. b) Création d un déclencheur (sécurité) On souhaite que toute mise à jour de la table EMP ne soit effectuée que durant les jours ouvrables, si la mise à jour a lieu le samedi ou le dimanche on déclenche une exception après l opération. Créer le trigger ouvrable. Utiliser TO CHAR qui permet de formater les dates et RAISE APPLICATION ERROR (consulter Help) NB Pour le tester exceptionnellement considérer que le jour de votre TP n est pas un jour ouvrable.
GLIN605 Info 2011-2012 6 c) Création d un déclencheur (contrôle de mise à jour) On suppose qu au sein de l entreprise chaque fois qu un employé change de travail on lui accorde en préalable (ce n est guère réaliste mais...) une augmentation de salaire de 50 Euros. Créer le trigger change fonction qui réalise ceci pour tout n uplet concerné et ceci avant la modification de travail. d) Création d un déclencheur (contrôle de mise à jour) Lors de toute insertion ou de toute modification concernant le salaire (sal) d un employé occupant un emploi autre que directeur on veut vérifier que le salaire est compris entre 10000 et 50000, si ceci n est pas vérifié on envoie un message approprié (salaire trop bas ou trop haut). Créer le trigger verif sal qui réalise ceci pour tout n uplet concerné après la modification de travail. 3.3 Vérification Vérifier la création des triggers. Pour cela consulter la vue du dictionnaire de données USER_triggers Vérifier que ces triggers sont actifs en essayant des commandes SQL. 3.4 Désactiver/Activer des triggers Dans certains cas, l administrateur ou l utilisateur qui a défini un trigger peut souhaiter le désactiver momentanément. a) Consulter l aide DISABLE/ENABLE. b) Désactiver le trigger alert. c) Réactiver le. 3.5 Suppression des triggers Supprimer les triggers de la table EMP.