Administration des bases de données Mehdi Louizi 1 Administration des bases de données Pourquoi PL/SQL 2 Administration des bases de données Pourquoi PL/SQL ? PL/SQL = PROCEDURAL LANGUAGE/SQL SQL est un langage non procédural Les traitements complexes sont parfois difficiles à écrire si on ne peut utiliser des variables et les structures de programmation comme les boucles et les alternatives On ressent vite le besoin d’un langage procédural pour lier plusieurs requêtes SQL avec des variables et dans les structures de programmation habituelles 3 Administration des bases de données Principales caractéristiques de PL/SQL Extension de SQL : des requêtes SQL cohabitent avec les structures de contrôle habituelles de la programmation structurée (blocs, alternatives, boucles) La syntaxe ressemble au langage Ada ou Pascal Un programme est constitué de procédures et de fonctions Des variables permettent l’échange d’information entre les requêtes SQL et le reste du programme 4 Administration des bases de données Utilisation de PL/SQL PL/SQL peut être utilisé pour l’écriture des procédures stockées et des triggers Oracle accepte aussi le langage Java Il convient aussi pour écrire des fonctions utilisateurs qui peuvent être utilisées dans les requêtes SQL (en plus des fonctions prédéfinies) Il est aussi utilisé dans des outils Oracle 5 Ex : Forms et Report Administration des bases de données Normalisation du language Langage spécifique à Oracle Tous les SQBG ont un langage procédural TransacSQL pour SQLServer, PL/pgSQL pour Postgresql Procédures stockées pour MySQL depuis 5.0 Tous les langages L4G des différents SGBDs se ressemblent 6 Administration des bases de données Utilisation de PL/SQL Le PL/SQL peut être utilisé sous 3 formes 7 Un bloc de code, exécuté comme une unique commande SQL, via un interpréteur standard (SQL+ ou iSQL*PLus) un fichier de commande PL/SQL un programme stocké(procédure, fonction, package ou trigger) Administration des bases de données Le langage PL/SQL 8 Administration des bases de données Blocs Un programme est structuré en blocs d’instructions de 3 types : Procédures anonymes Procédures nommées Fonctions nommées Un bloc peut contenir d’autres blocs 9 Administration des bases de données Structure d’un programme PL/SQL DECLARE -- définition des variables BEGIN -- code du programme EXCEPTION -- code de gestion des erreurs END; 10 Administration des bases de données Déclaration, initialisation des variables Identificateurs Oracle : 30 caractères au plus commence par une lettre Peut contenir lettres, chiffres, _, $ et # pas sensible à la casse Portée habituelle des langages à blocs Doivent être déclarés avant d’être utilisés 11 Administration des bases de données Déclaration, initialisation des variables Déclaration et initialisation Nom_variable type_variable := valeur; Initialisation Nom_variable := valeur; Déclaration multiple interdite Exemples: 12 age integer; nom varchar(30); dateNaissance date; ok boolean:= true; Administration des bases de données Initialisation de variables Plusieurs façons de donner une valeur à une variable : Opérateur d’affectation n := Directive INTO de la requête SELECT Exemples : 13 dateNaissance:= ’10/10/2004’; SELECT nome INTO nom FROM emp WHERE matr= 509; Administration des bases de données SELECT … INTO … select expr1, expr2,…into var1, var2,…met des valeurs de la BD dans une ou plusieurs variables expr1, expr2, … Le select ne doit renvoyer qu’une seule ligne Avec Oracle il n’est pas possible d’inclure un select sans «into» dans une procédure : pour ramener plusieurs lignes les curseurs. 14 Administration des bases de données Le type de variables VARCHAR2 Longueur maximale : 32767 octets Syntaxe: Nom_variable VARCHAR2(30); Exemple: name VARCHAR2(30); name VARCHAR2(30) := ’farid’; NUMBER(long,dec) Long : longueur maximale Dec : longueur de la partie décimale 15 Exemple: num_tel number(10); farid number(5,2)=142.12; Administration des bases de données Le type de variables (2) DATE Nom_variable DATE; Par défaut DD-MON-YY (18-DEC-02) Fonction TO_DATE Exemple : start_date := to_date(’29-SEP-2003’,’DD-MON-YYYY’); start_date := to_date(’29-SEP-2003:13:01’,’DD-MONYYYY:HH24:MI’); BOOLEAN 16 TRUE, FALSE ou NULL Administration des bases de données Déclaration %TYPE et %ROWTYPE On peut déclarer qu’une variable est du même type qu’une colonne d’une table ou (ou qu’une autre variable) : Exemple : nom emp.nome.%TYPE; Une variable peut contenir toutes les colonnes d’une ligne d’une table Exemple : 17 employe emp%ROWTYPE; déclare que la variable employe contiendra une ligne de la table emp Administration des bases de données Exemple d’utilisation DECLARE employe emp%ROWTYPE; nom emp.nome.%TYPE; BEGIN SELECT * INTO employe FROM emp WHERE matr= 900; nom := employe.nome; employe.dept:= 20; … INSERT into emp VALUES employe; END 18 Administration des bases de données Commentaires --Pour une fin de ligne /* Pour plusieurs lignes */ 19 Administration des bases de données PL /SQL : les principales commandes 20 Administration des bases de données Test conditionnel IF-THEN IF l_date > ’11-APR-03’ THEN l_salaire := l_salaire * 1.15; END IF; IF-THEN-ELSE 21 IF l_date > ’11-APR-03’ THEN l_salaire := l_salaire * 1.15; ELSE l_salaire := l_salaire * 1.05; END IF; Administration des bases de données Test conditionnel IF-THEN-ELSIF IF l_nom = MOHAMED’ THEN l_salaire := l_salaire * 1.15; ELSIF l_nom = ‘AHMED’ THEN l_salaire := l_salaire * 1.05; END IF; CASE 22 CASE sélecteur WHEN expression1 THEN résultat1 WHEN expression2 THEN résultat2 ELSE résultat3 END; Administration des bases de données Test conditionnel Exemple : val := CASE os WHEN ‘WINDOWS’ THEN ‘MICROSOFT’ WHEN ‘LEOPARD’ THEN ‘APPLE’ ELSE ‘Unix’ END; 23 Administration des bases de données Exercices Soit la table départements avec les champs suivants : Soit la séquence « dep » suivante : id_departement : clé primaire, entier non nul nom : varchar2(40) id_region : toujours nul Commence à 1, pas de 1, pas de valeur minimale, valeur maximale égale à 100 Créez un bloc PL/SQL pour insérer un nouveau département dans la table départements Utilisez la séquence dep pour générer un numéro de département. Créez un paramètre pour le nom du département. 24 Administration des bases de données Exercices Soit la table commande avec les champs suivants : id_commande : clé primaire id_employe : clé étrangère nom : varchar2(40) total : montant de la commande : entier, trois chiffres après la virgule Soit la table employés id_employe : clé_primaire commission : entier 3 chiffres Un employé a plusieurs commandes, une commande a un et un seul employé Créez un paramètre qui reçoit un numéro d’employé Trouvez la somme totale de toutes les commandes traitées par cet employé Mettre à jour le pourcentage de commission de cet employé : 25 Administration des bases de données Exercices Si la somme < 100,000 passer la commission à 10 Si la somme est comprise entre 100,000 et 1,000,000 inclus passer la commission à 15 Si la somme excède 1,000,000 passer la commission à 20 Si aucune commande n’existe pour cet employé, mettre la commission à 0 Valider la modification 26 Administration des bases de données Les boucles LOOP instructions exécutables; END LOOP; Obligation d’utiliser la commande EXIT WHILE condition LOOP instructions exécutables; END LOOP; 27 Administration des bases de données Les boucles FOR variable IN debut..fin LOOP instructions; END LOOP; 28 Administration des bases de données Affichage Activer le retour écran set serveroutput on size 10000 Affichage 29 dbms_output.put_line(chaîne); Utilise || pour faire une concaténation Administration des bases de données Exemple set serveroutput on --sous SQLPLUS DECLARE i number(2); BEGIN FOR i IN 1..5 LOOP dbms_output.put_line(‘Nombre: ’|| i ); END LOOP; END; 30 Administration des bases de données Exemple DECLARE nb integer; BEGIN delete from emp where matr in (600, 610); nb := sql%rowcount; --curseur sql dbms_output.put_line('nb = ' || nb); END; 31 Administration des bases de données Exemple DECLARE compteur number(3); i number(3); BEGIN select count(*) into compteur from clients; FOR i IN 1..compteur LOOP dbms_output.put_line('Nombre : ' || i ); END LOOP; END; 32 Administration des bases de données Les curseurs 33 Administration des bases de données Les curseurs Toutes les requêtes SQL sont associées à un curseur Ce curseur représente la zone mémoire utilisée pour parser(analyser) et exécuter la requête Le curseur peut être implicite (pas déclaré par l’utilisateur) ou explicite Les curseurs explicites servent à retourner plusieurs lignes avec un select 34 Administration des bases de données Les curseurs Tous les curseurs ont des attributs que l’utilisateur peut utiliser %ROWCOUNT: nombre de lignes traitées par le curseur %FOUND: vrai si au moins une ligne a été traitée par la requête ou le dernier fetch %NOTFOUND: vrai si aucune ligne n’a été traitée par la requête ou le dernier fetch %ISOPEN: vrai si le curseur est ouvert (utile seulement pour les curseurs explicites) 35 Administration des bases de données Les curseurs Les curseurs implicites Les curseurs implicites sont tous nommés SQL Exemple : DECLARE nb_lignes integer; BEGIN delete from emp where dept= 10; nb_lignes:= SQL%ROWCOUNT; … 36 Administration des bases de données Les curseurs Les curseurs explicites Pour traiter les select qui renvoient plusieurs lignes Ils doivent être déclarés On les utilise dans une boucle FOR Utilisation implicite des instructions OPEN, FETCH et CLOSE 37 Administration des bases de données Les curseurs Les curseurs explicites DECLARE nom varchar2(30); CURSOR c_nom_clients IS SELECT nom,adresse FROM clients; BEGIN FOR le_client IN c_nom_clients LOOP dbms_output.put_line('Employé: ' || UPPER(le_client.nom) ||' Ville : '|| le_client.adresse); END LOOP; END; 38 Administration des bases de données Les curseurs Curseurs paramétrés 39 Un curseur paramétré peut servir plusieurs fois avec des valeurs des paramètres différentes On doit fermer le curseur entre chaque utilisation de paramètres différents (sauf si on utilise «for »qui ferme automatiquement le curseur) Administration des bases de données Les curseurs Curseurs paramétrés DECLARE CURSOR c(p_dept integer) is select dept, nome from emp where dept= p_dept; BEGIN FOR employe in c(10)LOOP dbms_output.put_line(employe.nome); END LOOP; FOR employe in c(20) LOOP dbms_output.put_line(employe.nome); END LOOP; END; 40 Administration des bases de données Les exceptions 41 Administration des bases de données Les exceptions Une exception est une erreur qui survient durant une exécution 2 types d’exception : 42 prédéfinie par Oracle définie par le programmeur Administration des bases de données Saisir les exceptions Une exception ne provoque pas nécessairement l’arrêt du programme si elle est saisie par un bloc (dans la partie «EXCEPTION ») 43 Administration des bases de données Les exceptions prédéfinies NO_DATA_FOUND TOO_MANY_ROWS Erreur numérique ZERO_DIVIDE Quand Select into retourne plusieurs lignes VALUE_ERROR Quand Select into ne retourne aucune ligne Division par zéro OTHERS 44 Toutes erreurs non interceptées Administration des bases de données Traitement des exceptions BEGIN … EXCEPTION WHEN NO_DATA_FOUND THEN ... WHEN TOO_MANY_ROWS THEN ... WHEN OTHERS THEN--optionnel ... END; 45 Administration des bases de données Les exceptions Utilisateur Elles doivent être déclarées avec le type EXCEPTION On les lève avec l’instruction RAISE 46 Administration des bases de données Exemple d’exception utilisateur DECLARE salaire numeric(8,2); salaire_trop_bas EXCEPTION; BEGIN select sal into salaire from emp where matr= 50; if salaire < 300 then RAISE salaire_trop_bas; end if; EXCEPTION WHEN salaire_trop_bas THEN dbms_output.put_line(‘Salaire trop bas’); WHEN OTHERS THEN dbms_output.put_line(SQLERRM); END; 47 Administration des bases de données Procédures et Fonctions 48 Administration des bases de données Bloc anonyme ou nommé Un bloc anonyme PL/SQL est un bloc «DECLARE – BEGIN –END »comme dans les exemples précédents Dans SQL*PLUS on peut exécuter directement un bloc PL/SQL anonyme en tapant sa définition Le plus souvent, on crée plutôt une procédure ou une fonction nommée pour réutiliser le code 49 Administration des bases de données Procédures sans paramètres create or replace procedure list_nom_clients IS BEGIN DECLARE nom varchar2(30); CURSOR c_nom_clients IS select nom,adresse from clients; BEGIN FOR le_client IN c_nom_clients LOOP dbms_output.put_line('Employé: ' || UPPER(le_client.nom) ||' Ville : ‘ || le_client.adresse); END LOOP; END; END; 50 Administration des bases de données Procédures avec paramètre create or replace procedure list_nom_clients (ville IN varchar2, IN : en lecture seule result OUT number) OUT : en écriture seule IN OUT : en lecture/écriture IS BEGIN DECLARE CURSOR c_nb_clients IS select count(*) from clients where adresse=ville; BEGIN open c_nb_clients; fetch c_nb_clients INTO result; END; END; 51 Administration des bases de données Récupération des résultats sous SQL+ Déclarer une variable SQL> execute list_nom_clients('paris',:nb) Visualisation du résultat Une variable globale s’utilise avec le préfixe : Exécuter la fonction SQL> variable nb number; SQL> print Description des paramètres 52 SQL> desc nom_procedure Administration des bases de données Fonctions sans paramètres create or replace function nombre_clients return number Déclaration du type de retour de la IS fonction BEGIN DECLARE i number; CURSOR get_nb_clients IS select count(*) from clients; BEGIN open get_nb_clients; fetch get_nb_clients INTO i; return i; END; END; Exécution: select nombre_clients() from dual 53 Administration des bases de données Fonctions avec paramètres Seuls les paramètres IN (en lecture seule) sont autorisés pour les fonctions Create or replace Function euro_to_fr(somme IN number) return number IS taux constant number:= 6.55957; BEGIN return somme * taux; END; 54 Administration des bases de données Procédures et fonctions Suppression de procédures ou fonctions DROP PROCEDURE nom_procedure DROP FUNCTION nom_fonction Table système contenant les procédures et fonctions : user_source 55 Administration des bases de données Compilation, exécution et utilisation Compilation Exécution Sous SQL*PLUS, il faut taper une dernière ligne contenant «/»pour compiler une procédure ou une fonction Sous SQL*PLUS on exécute une procédure PL/SQL avec la commande EXECUTE : EXECUTE nomProcédure(param1, …); Utilisation 56 Les procédures et fonctions peuvent être utilisées dans d’autres procédures ou fonctions ou dans des blocs PL/SQL anonymes Les fonctions peuvent aussi être utilisées dans les requêtes SQL Administration des bases de données Triggers 57 Administration des bases de données Création de triggers Exemple : CREATE TRIGGER nom BEFORE DELETE OR INSERT OR UPDATE ON table FOR EACH ROW WHEN (new.empno>0) DECLARE ............ <<<<déclarations>>>> BEGIN ............ <<<< bloc d'instructions PL/SQL>>>> END; 58 Administration des bases de données Le nom du trigger doit être unique dans un même schéma peut être le nom d'un autre objet (table, vue, procédure) mais à éviter 59 Administration des bases de données Option BEFORE/AFTER elle précise le moment de l'exécution du trigger les triggers AFTER row sont plus efficaces que les BEFORE row parce qu'ils ne nécessitent pas une double lecture des données. 60 Administration des bases de données Définition du trigger Elle comprend le type d'instruction SQL qui déclenche le trigger : DELETE, INSERT, UPDATE On peut en avoir une, deux ou les trois. Pour UPDATE, on peut spécifier une liste de colonnes. Dans ce cas, le trigger ne se déclenchera que si l'instruction UPDATE porte sur l'une au moins des colonnes précisée dans la liste. S'il n'y a pas de liste, le trigger est déclenché pour toute instruction UPDATE portant sur la table. 61 Administration des bases de données Définition du trigger La définition du trigger précise la table associée au trigger : 62 une et une seule table pas une vue. Administration des bases de données Types de triggers Le type d’un trigger détermine : quand ORACLE déclenche le trigger, combien de fois ORACLE déclenche le trigger. Le type du trigger est défini par l’utilisation de l’une ou l’autre des options suivantes : 63 BEFORE, AFTER, FOR EACH ROW Administration des bases de données ORACLE propose deux types de triggers les triggers lignes qui se déclenchent individuellement pour chaque ligne de la table affectée par le trigger, les triggers globaux qui sont déclenchés une seule fois. Si l'option FOR EACH ROW est spécifiée, c'est un trigger ligne, sinon c'est un trigger global. 64 Administration des bases de données Types de triggers Pour les triggers lignes, on peut introduire une restriction sur les lignes à l'aide d'une expression logique SQL : c'est la clause WHEN : 65 Cette expression est évaluée pour chaque ligne affectée par le trigger. Le trigger n'est déclenché sur une ligne que si l'expression WHEN est vérifiée pour cette ligne. L'expression logique ne peut pas contenir une sous-question. Par exemple, WHEN (new.empno>0) empêchera l'exécution du trigger si la nouvelle valeur de EMPNO est 0, négative ou NULL. Administration des bases de données Triggers Le corps du trigger est un bloc PL/SQL : 66 Il peut contenir du SQL et du PL/SQL. Il est exécuté si l'instruction de déclenchement se produit et si la clause de restriction WHEN, le cas échéant, est évaluée à vrai. Il est différent pour un trigger ligne et pour un trigger global. Administration des bases de données Les noms de corrélation Dans un trigger ligne, on doit pouvoir accéder aux ancienne et nouvelle valeurs de colonne de la ligne. Les noms de corrélation permettent de désigner ces deux valeurs : un nom pour l'ancienne et un pour la nouvelle. Si l'instruction de déclenchement du trigger est INSERT, seule la nouvelle valeur a un sens. Si l'instruction de déclenchement du trigger est DELETE, seule l'ancienne valeur a un sens. 67 Administration des bases de données Les noms de corrélation La nouvelle valeur est appelée L'ancienne valeur est appelée :new.colonne :old.colonne Exemple : IF :new.salaire < :old.salaire ........ 68 Administration des bases de données L’option REFERENCING Si une table s'appelle NEW ou OLD, on peut utiliser REFERENCING pour éviter l'ambiguïté entre le nom de la table et le nom de corrélation. Exemple : CREATE TRIGGER nomtrigger BEFORE UPDATE ON new REFERENCING new AS newnew FOR EACH ROW BEGIN :newnew.colon1:= TO_CHAR(:newnew.colon2); END; 69 Administration des bases de données Les prédicats conditionnels INSERTING, DELETING et UPDATING Quand un trigger comporte plusieurs instructions de déclenchement (par exemple INSERT OR DELETE OR UPDATE), on peut utiliser des prédicats conditionnels (INSERTING, DELETING et UPDATING) pour exécuter des blocs de code spécifiques pour chaque instruction de déclenchement. 70 Administration des bases de données Les prédicats conditionnels INSERTING, DELETING et UPDATING Exemple : CREATE TRIGGER ... BEFORE INSERT OR UPDATE ON employe ....... BEGIN ...... IF INSERTING THEN ....... END IF; IF UPDATING THEN ........ END IF; ...... END; 71 Administration des bases de données Les prédicats conditionnels INSERTING, DELETING et UPDATING UPDATING peut être suivi d'un nom de colonne : CREATE TRIGGER ... BEFORE UPDATE OF salaire, commission ON employe ....... BEGIN ...... IF UPDATING ('salaire') THEN ........ END IF; ...... END; 72 Administration des bases de données Nombre de triggers par table On peut avoir au maximum un trigger de chacun des types suivants pour chaque table : BEFORE UPDATE row BEFORE DELETE row BEFORE INSERT statement BEFORE INSERT row BEFORE UPDATE statement BEFORE DELETE statement AFTER UPDATE row AFTER DELETE row AFTER INSERT statement AFTER INSERT row AFTER UPDATE statement AFTER DELETE statement. Même pour UPDATE, on ne peut pas en avoir plusieurs avec des noms de colonnes différents. 73 Administration des bases de données Instructions SQL autorisées les instructions du LMD sont autorisées les instructions du LDD ne sont pas autorisées les instructions de contrôle de transaction (ROLLBACK, COMMIT) ne sont pas autorisées. 74 Administration des bases de données Triggers Ordre de traitement des lignes On ne peut pas gérer l'ordre des lignes traitées par une instruction SQL. On ne peut donc pas créer un trigger qui dépende de l'ordre dans lequel les lignes sont traitées. Triggers en cascade 75 Un trigger peut provoquer le déclenchement d'un autre trigger. ORACLE autorise jusqu'à 32 triggers en cascade à un moment donné. Administration des bases de données Limite Un trigger ligne ne peut pas lire et/ou modifier la table concernée (appelée table mutante) par l'instruction (INSERT, UPDATE ou DELETE) qui a déclenché ce trigger. Exemple : On peut utiliser des tables temporaires. 76 Administration des bases de données Triggers Conditions nécessaires pour créer un trigger il faut avoir le privilège CREATE TRIGGER il faut soit posséder la table sur laquelle on veut définir un trigger, soit posséder le privilège ALTER sur la table sur laquelle on veut définir le trigger, soit posséder le privilège ALTER ANY TABLE Modification de triggers 77 Pour modifier un trigger, on refait une instruction CREATE TRIGGER suivie de OR REPLACE ou bien on supprime le trigger (DROP TRIGGER nomtrigger) et on le crée à nouveau. Administration des bases de données Activation d’un trigger Un trigger peut être activé ou désactivé. S’il est désactivé, ORACLE le stocke mais l’ignore. On peut désactiver un trigger si : il référence un objet non disponible on veut charger rapidement un volume de données important ou recharger des données déjà contrôlées. Par défaut, un trigger est activé dès sa création. 78 Administration des bases de données Activation d’un trigger Pour désactiver un trigger, on utilise l’instruction ALTER TRIGGER avec l’option DISABLE : On peut désactiver tous les triggers associés à une table avec la commande : ALTER TRIGGER nomtrigger DISABLE; ALTER TABLE nomtable DISABLE ALL TRIGGERS; A l’inverse on peut réactiver un trigger : 79 ALTER TRIGGER nomtrigger ENABLE; ou tous les triggers associés à une table : ALTER TABLE nomtable ENABLE ALL TRIGGERS; Administration des bases de données Recherche d’information sur les triggers Les définitions des triggers sont stockées dans les tables de la métabase, notamment dans les tables USER_TRIGGERS, ALL_TRIGGERS et DBA_TRIGGERS 80 Administration des bases de données La procédure raise_application_error La procédure raise_application_error (error_number,error_message) 81 error_number doit être un entier compris entre -20000 et 20999 error_message doit être une chaîne de 500 caractères maximum. Quand cette procédure est appelée, elle termine le trigger, défait la transaction (ROLLBACK), renvoie un numéro d'erreur défini par l'utilisateur et un message à l'application. Administration des bases de données Gestion des exceptions Si une erreur se produit pendant l'exécution d'un trigger, toutes les mises à jour produites par le trigger ainsi que par l'instruction qui l'a déclenché sont défaites. On peut introduire des exceptions en provoquant des erreurs. 82 Une exception est une erreur générée dans une procédure PL/SQL. Elle peut être prédéfinie ou définie par l'utilisateur. Un bloc PL/SQL peut contenir un bloc EXCEPTION gérant les différentes erreurs possibles avec des clauses WHEN. Une clause WHEN OTHERS THEN ROLLBACK; gère le cas des erreurs non prévues. Administration des bases de données Exceptions prédéfinies – quelques exemples NO_DATA_FOUND DUP_VAL_ON_INDEX tentative d'insertion d'une ligne avec une valeur déjà existante pour une colonne à index unique ZERO_DIVIDE cette exception est générée quand un SELECT INTO ne retourne pas de lignes division par zéro etc 83 Administration des bases de données Quelques exemples employe(numserv,....) service(numserv,...) /* vérifier que le service de l'employé existe bien */ CREATE TRIGGER verif_service BEFORE INSERT OR UPDATE OF numserv ON employe FOR EACH ROW WHEN (new.numserv is not null) DECLARE noserv integer; BEGIN noserv:=0; SELECT numserv INTO noserv FROM SERVICE WHERE numserv=:new.numserv; IF (noserv=0) 84 Administration des bases de données Quelques exemples (suite) THEN raise_application_error(-20501, 'N° de service non correct'); END IF; END; employe(salaire,....) /* mettre une valeur par défaut si le champ ne contient rien */ /* affecter 240 au salaire d'un employe qui n'en a pas */ CREATE TRIGGER smic BEFORE INSERT OR UPDATE OF salaire ON employe FOR EACH ROW WHEN (new.salaire is null) BEGIN SELECT 240 INTO :new.salaire FROM employe; END; 85 Administration des bases de données Quelques exemples employe(numemp,salaire,grade,...) grille(grade,salmin,salmax) /* vérifier le salaire d'un employé */ /* s'assurer que le salaire est compris dans les bornes correspondant au grade de l'employé */ CREATE TRIGGER verif_grade_salaire BEFORE INSERT OR UPDATE OF salaire, grade ON employe FOR EACH ROW DECLARE minsal number; maxsal number; BEGIN /* retrouver le salaire minimum et maximum du grade */ SELECT salmin,salmax INTO minsal, maxsal FROM grille 86 Administration des bases de données Quelques exemples (suite) WHERE grade= :new.grade; /* s'il y a un problème, on provoque une erreur */ IF (:new.salaire<minsal OR :new.salaire>maxsal) THEN raise_application_error (-20300,'Salaire‘||TO_CHAR (:new.salaire)||'incorrect pour ce grade'); EXCEPTION WHEN no_data_found THEN raise_application_error(-20301,'Grade incorrect'); END; 87 Administration des bases de données Quelques exemples CREATE TABLE Livre ( noLivre NUMERIC PRIMARY KEY, prix NUMERIC(9,2) ) CREATE TABLE PrixLivre ( nb NUMERIC, somme NUMERIC(12,2) ) INSERT INTO PrixLivre VALUES (1,0); Créer un Trigger qui permet de vérifier avant chaque insertion d’un livre son prix : Si le prix est supérieur à 0 S’il est compris entre le prix moyen * 0.7 et le prix moyen *1.3 , mettre à jour la table PrixLivre (somme et nb) Si le prix est > prix_moyen*0.7 et <prix_moyen*1.3 soulever une exception Sinon mettre à jour uniquement le champ somme de la table PrixLivre 88 Administration des bases de données Quelques exemples (suite) DROP TRIGGER moyenne_prix; CREATE TRIGGER moyenne_prix BEFORE INSERT OF Prix ON Livre FOR EACH ROW DECLARE prix_moyen number; BEGIN SELECT SOMME/NB INTO prix_moyen FROM PrixLivre; IF (prix_moyen>0) THEN IF (:new.PRIX < prix_moyen*0.7 OR :new.PRIX > prix_moyen*1.3) THEN raise_application_error(-20001,'Prix modifiant trop la moyenne!'); END IF; IF (:new.PRIX > prix_moyen*0.7 AND :new.PRIX < prix_moyen*1.3) THEN UPDATE PrixLivre SET NB=NB+1, SOMME=SOMME+:new.PRIX; END IF; ELSE UPDATE PrixLivre SET SOMME=SOMME+:new.PRIX; END IF; END; 89 Administration des bases de données Quelques exemples Soit une table quelconque TABL, dont la clé primaire CLENUM est numérique. Définir un trigger en insertion permettant d’implémenter une numérotation automatique de la clé. Le premier numéro doit être 1. 90 Administration des bases de données Quelques exemples (suite) create or replace trigger cleauto before insert on tabl for each row begin declare n integer; newkey integer; mon_exception exception; -- Recherche s'il existe des tuples dans la table select count(*) into n from tabl; if n=0 then raise mon_exception; -- Premiere insertion end if; -- Recherche la valeur de cle C la plus elevee -- et affecte C+1 a la nouvelle cle select max(clenum) into newkey from tabl; :new.clenum := newkey + 1; exception -- Premier numero = 1 when mon_exception then :new.clenum := 1; end; 91 Administration des bases de données Quelques exemples CLIENT (NUMCL, NOM, PRENOM, ADR, CP, VILLE, SALAIRE, CONJOINT) DETENTEUR (NUMCL, NUMCP) COMPTE (NUMCP, DATEOUVR, SOLDE) Écrire un trigger en insertion permettant de contrôler les contraintes suivantes : - le département dans lequel habite le client doit être 01, 07, 26, 38, 42, 69, 73, ou 74 (sinon il n’est pas en France*) - le nom du conjoint doit être le même que celui du client. 92 *Ceci est une supposition Administration des bases de données Quelques exemples (suite 1/3) CREATE TRIGGER INS_CLIENT BEFORE INSERT ON CLIENT FOR EACH ROW DECLARE nom_conjoint CLIENT.NOM%TYPE ; compteur CLIENT.NUMCL%TYPE ; pb_dept EXCEPTION ; pb_conjoint1 EXCEPTION ; pb_conjoint2 EXCEPTION ; BEGIN -- Contrainte sur le département IF (:NEW.CP) NOT IN (01, 07, 26, 38, 42, 69, 73, 74) THEN RAISE pb_dept ; END IF ; 93 Administration des bases de données Quelques exemples (suite 2/3) -- Contrainte sur le nom du conjoint (+ test d’existence du conjoint) IF :NEW.CONJOINT IS NOT NULL THEN SELECT COUNT(*), NOM INTO compteur, nom_conjoint FROM CLIENT WHERE NUMCL = :NEW.CONJOINT GROUP BY NOM ; IF compteur = 0 THEN -- Pas de conjoint RAISE pb_conjoint1 ; END IF ; IF nom_conjoint <> :NEW.NOM THEN RAISE pb_conjoint2 ; END IF ; END IF ; 94 Administration des bases de données Quelques exemples (suite 3/3) EXCEPTION WHEN pb_dept THEN RAISE_APPLICATION_ERROR (-20501, ‘Insertion impossible : le client n’habite pas en France!’) ; WHEN pb_conjoint1 THEN RAISE_APPLICATION_ERROR (-20502, ‘Insertion impossible : le conjoint du client n’existe pas !’) ; WHEN pb_conjoint2 THEN RAISE_APPLICATION_ERROR (-20503, ‘Insertion impossible : le nom du conjoint est différent de celui du client !’) ; END ; 95 Administration des bases de données Administration Oracle 96 Administration des bases de données Types d’utilisateurs d’une BD 97 développeurs d’application développent les programmes suivant une logique figée utilisateurs finaux utilisent ces programmes utilisateurs ‘évolués’ utilisent soit ces programmes soit un langage spécifique comme SQL ou d’autres outils administrateur de la base de données (DBA= Data Base Administrator): installe, maintient, gère la BD Administration des bases de données Rôle du DBA Niveau Conceptuel: définir ( ou participer à la définition) du schéma conceptuel Niveau externe: décide qui peut accéder à quoi et comment gère les utilisateurs Niveau interne : assurer la correspondance entre le schéma conceptuel et les possibilités du SGBD de façon à en tirer les meilleurs profits en terme de performance, d intégrité et de sécurité 98 Administration des bases de données Rôle du DBA Rôle organisationnel Rôle technique 99 Définition du schéma conceptuel des données Partage des données par les utilisateurs Installation su SGBD et des outils associés Création de la base de données et assurer son évolution Administration des bases de données Rôle du DBA Gestion des privilèges d ’accès Amélioration des performances Sécurité et cohérences des données Echange des données entre la base de données et le monde extérieur 100 Administration des bases de données Structure physique d’une BD Un ensemble de fichiers fichiers de données fichiers de reprise fichiers de contrôle La spécification des fichiers de données et de reprise se fait lors de la création ou de la modification de la structure d ’une base 101 Administration des bases de données Fichiers de données Un ou plusieurs fichiers de données : assurent le stockage des objets créés par les utilisateurs, et le dictionnaire de données. Un fichier de données est associé à une et une seule base de données. Taille d ’un fichier de données : attribuée au moment de sa création, ne peut jamais être modifiée 102 Administration des bases de données Fichiers de reprise Contiennent les modifications des données les plus récentes. Lors d ’une panne Oracle utilise ces fichiers pour remettre la base dans un état cohérent. Fichiers de reprise archivés 103 Administration des bases de données Fichiers de contrôle Contient les informations relatives à la structure physique de la BD: nom de la BD, les noms et localisation des fichiers de données et de reprise. Oracle utilise ce fichier pour identifier les fichiers de données et de reprise Duplication de ce fichier pour faire face aux incidents éventuels 104 Administration des bases de données Structure logique d’une Base de Données Des tablespaces Des segments Des extensions Des blocs 105 Administration des bases de données TABLESPACE Utilisé pour regrouper un ensemble d ’objets logiques ( ex: tables, index,etc.) une base de donnée doit avoir au moins un tablespace appelé SYSTEM qui contient le dictionnaire des données un 2ème tablespace pour stocker les objets de la base. 106 Administration des bases de données TABLESPACE CREATE TABLESPACE nom_tablespace DATAFILE spec_fichier [,spec_fichier] [DEFAULT STORAGE (spec_stockage)] [ONLINE | OFFLINE ]. CREATE USER nom_user IDENTIFIED BY [mot_pass | EXTERNALLY] [DEFAULT TABLESPACE nom_tablespace] [TEMPORARY TABLESPACE nom_tablespace] [QUOTA {n [K | M] ON nom_tablespace | UNLIMITED] 107 Administration des bases de données Segment, Extension et Bloc Lors de la création d ’un fichier, Oracle réserve tout l ’espace qui lui est associé. A l’intérieur de ce fichier, l’espace est géré dynamiquement au fur et à mesure de l ’utilisation de la base de données: 108 se fait selon trois niveau de granularité: le segment, l ’extension et le bloc Administration des bases de données Bloc et extension Bloc: Composé d ’un certain nombre d ’octets, taille définie au moment de la création de la BD la plus petite unité logique E/S utilisée par Oracle Extension 109 Unité logique d ’allocation d ’espace composée d ’un ensemble contigu de blocs de données alloués simultanément à un segment Administration des bases de données Segment Un ensemble d ’une ou plusieurs extensions contenant les données d’une structure logique dans un tablespace 5 types de segments: 110 Segments de données Segments d ’index Segments d ’annulation (rollback) Segments temporaires Segments d ’amorçage (bootstrap) Administration des bases de données II. Création d’une base de données Oracle est livré en standard avec une base de données Le DBA a le choix: modifier la structure de cette base créer une nouvelle base. 111 Evaluer l ’espace disque nécessaire prévoir les moyens assurant la sécurité de la base. Administration des bases de données Création d’une base de données Sauvegarde des bases existantes Création d ’un nouveau fichier d’initialisation Edition du nouveau fichier d ’initialisation Arrêt et redémarrage d’oracle Création de la nouvelle base 112 Administration des bases de données Edition du nouveau fichier d’initialisation On doit modifier les paramètres suivants: 113 DB_NAME = nouveau_nom_de_bd DB_DOMAIN =nom_domaine CONTROL_FILES =(nom_fichier_control_,..) INIT_SQL_FILES = (SQL.BSQ, CATALOG.ORA, nom_fichier1, nom_fichier2…) Administration des bases de données Création de la nouvelle BD 114 CREATE DATABASE [nom_base] [CONTROLFILE REUSE] [LOGFILE [GROUP entier] spec_fich] [MAXLOGFILES entier] [MAXLOGMEMBERS entier] [MAXLOGHISTORY entier] [DATAFILE spec_fichier[,spec_fichier]..] [MAXDATAFILES entier] [MAXINSTANCES entier] [ARCHIELOG |NOARCHIVELOG] [EXLUSIVE] [CHARACTER SET code]; Administration des bases de données Création de la nouvelle BD Création : 115 des fichiers de données des fichiers de reprise des fichiers de contrôle un tablespace SYSTEM et un rollback segment SYSTEM un dictionnaire de données deux utilisateurs identifiés par SYS et SYSTEM Administration des bases de données Exemple CREATE DATABASE gestion LOGFILE GROUP 1 (‘ gestion_log11 ’, ’gestion_log12 ’) SIZE 500K, GROUP 2 (‘ gestion_log21 ’, ’gestion_log22 ’) SIZE 500K DATAFILE ‘ gestion_system ’ SIZE 5M; 116 Administration des bases de données Modification des caractéristiques d’une BD ALTER DATABASE [nom_base] [ADD] [DROP] [RENAME FILE ‘ fichier1 ’[,fichier2] TO ‘ fichierc1 ’….] [RENAME GLOBAL_NAME TO nom_base[.domaine] 117 Administration des bases de données Démarrage et fermeture d ’une BD Démarrage : Mettre la BD à la disposition des utilisateurs afin qu’ils puissent y accéder et effectuer les différentes opérations Fermeture: 118 déconnecter tous les utilisateurs et fermer toutes les structures de données Administration des bases de données Démarrage et fermeture d’une BD STARTUP [FORCE] [RESTRICT][PFILE=nom_fichier_param] {[OPEN] [RECOVER] [nom_base] | [MOUNT] [options]} | [NOMOUNT]; SHUTDOWN [ABORD | IMMIDIATE | NORMAL]; 119 Administration des bases de données III.Transactions et accès concurrents SGBD : mettre à la disposition d ’un grand nombre d ’utilisateurs un ensemble cohérents de données. Cette cohérence est assurée à l ’aide des concepts de transactions et d ’accès concurrents. Transaction: unité logique de traitement regroupant un ensemble d ’opérations élémentaires ( commandes SQL) 120 Administration des bases de données Atomicité de la transaction Afin de conserver la cohérence de la base, le système doit garantir l ’atomicité de l exécution des transactions: toute transaction est soit complètement exécutée soit pas du tout. 121 Administration des bases de données Atomicité de la transaction Si les CI ne sont pas vérifiées à la fin de l ’exécution du corps de ’une transaction, la transaction doit être annulée et l ’état de la base restitué. Fin de transaction Exécution totale et cohérente Commit Incohérence Annulation Rollback La gestion des transactions inclut 2 aspects majeurs: Contrôle de concurrence fiabilité. 122 Administration des bases de données Journaux et Sauvegarde • Journal des images avant – Journal contenant les débuts de transactions, les valeurs d'enregistrement avant mises à jour, les fins de transactions (commit ou Rollback) – Il permet de défaire les mises à jour effectuées par une transaction • Journal des images après – Journal contenant les débuts de transactions, les valeurs d'enregistrement après mises à jour, les fins de transactions (commit ou Rollback) – Il permet de refaire les mises à jour effectuées par une transaction 123 Administration des bases de données Points de Sauvegardes • Introduction de points de sauvegarde intermédiaires (savepoint) – • • 124 il est possible d ’annuler un sous ensemble d ’opérations d ’une transaction à partir d ’un point de repère Begin_Trans – update – update – savepoint – update – update Commit unité d'oeuvre Non perte du contexte unité d'oeuvre Administration des bases de données Point de sauvegardes Création d ’un point de reprise: SAVEPOINT nom_point_de_reprise; Pour annuler les opérations à partir d ’un point de repère, on utilise la commande ROLLBACK en précisant le point de repère 125 ROLLBACK TO [SAVEPOINT] nom_point_de_reprise Administration des bases de données Propriétés des transactions Atomicité: une transaction est une unité indivisible: Exécution totale ou non Consistance: Une transaction doit assurer que les données manipulées sont dans un état consistant ( inchangé) tout au long de son exécution même si d ’autres transactions essaient de la modifier. Indépendance: les transactions doivent s’exécuter indépendamment l ’une de l ’autre : l ’effet partiel d ’une transaction incomplète ne doit pas être visible pour les autres Durabilité: les effets d ’une transaction réussite doivent être enregistrées dans la BD même en présence d ’une panne. Restituer un état cohérent de la base après une panne 126 Administration des bases de données Les menaces Panne de transaction erreur en cours d'exécution du programme nécessité de défaire les mises à jour effectuées Panne système reprise avec perte de la mémoire centrale toutes les transactions en cours doivent être défaites Panne disque perte de données de la base Problèmes de concurrence pertes d ’opérations introduction d ’incohérences 127 Administration des bases de données Gestion des accès concurrents SGBD : assurer la gestion des accès concurrents L’exécution simultanée d ’un ensemble de transactions peut fournir des résultats faux ou détruire la cohérence de la base exemple Temps Transaction T0 Transaction T1 Lire E Lire E Ecrire E Ecrire E Pb: Mise à jour de E par T0 est perdue état de la base incohérence 128 Administration des bases de données Mécanismes de prévention Mécanisme de pré-séquencement Mécanisme de sérialisation 129 les transactions sont exécutées en série il n ’y a plus de concurrence à l ’exécution. basé sur le verrouillage des données à manipuler. Administration des bases de données Sérialisation 130 Une exécution simultanée de plusieurs transactions est sérialisable si, quel que soit l ’état cohérent initial de la BD, elle fournit un résultat identique à celui produit par une exécution séquentielle des transactions. Il doit exister au moins un ordre d’exécution séquentielle des transactions qui fournit le même résultat. Les transactions vérifiant le concept de sérialisation sont dites sérialisées. Administration des bases de données Techniques de verrouillage Verrouiller momentanément les données utilisées par une transaction jusqu’à la fin de la mise à jour. les autres transactions demandant ces données sont mises en attente jusqu’à leur libération ( déverrouillage). Le verrouillage s ’applique d ’une façon générale à une ressource. Objets créés par les utilisateurs ( tables, ou quelques lignes d ’une table) objets système ( éléments du dictionnaire ou des zones de données en mémoire centrale) 131 Administration des bases de données Exemple d’utilisation de verrous T1 132 temps T2 T1 temps T2 t1 Début t1 Début Début t2 Lock A Début t2 Lock x Lock A t3 Lire A Lock y t3 Lire x wait t4 A :=A+100 Lire y t4 x:=x-10 wait t5 Ecrire A y :=y+100 t5 Ecrire x wait t6 Unlock A Ecrire y t6 Lock y Lire A t7 Commit Lock x t7 wait A :=A-10 t8 Wait t8 wait Ecrire A t9 wait t9 wait Unlock A t10 wait t10 commit t11 commit t11 Administration des bases de données Deadlock Interblocage (Deadlock) L ’emploi des verrous peut entraîner des situations dans lesquelles 2 ou plusieurs transactions se trouvent bloquées parce qu’elles utilisent les mêmes ressources; chacune se trouve en attente de la libération de ressources utilisées par une autre transaction. Solutions Détection/résolution: laisser les transactions se mettre en situation d’interblocage. Détecter l’interblocage et le résoudre en tuant l’une des transactions. Préventif : éviter les interblocages. 133 Administration des bases de données Modes d’activation de verrouillage Verrouillage implicite Le SGBD Oracle effectue tous les verrouillage nécessaires pour le maintien de la cohérence des données. Verrouillage explicite 134 Au niveau des transactions Au niveau d ’une instance Administration des bases de données Sécurité de données L’une des tâches de l’administrateur de données est d’assurer la sécurité de l ’information stockée. SGBD Oracle assure la protection des données de la base par: 135 le contrôle d’authenticité des utilisateurs au moment de la connexion les tablespaces accessibles par défaut, la limitation des ressources les privilèges d ’accès aux objets de la base. Administration des bases de données Les profils Pour éviter une consommation incontrôlée des ressources système, celles-ci peuvent être définies explicitement par l’administrateur de chaque type d ’utilisateur. Une base de données peut être composée de plusieurs profils qui sont affectés à des utilisateurs. L ’administrateur de la base possède une option pour activer ou désactiver les limites de ressources au niveau de la BD. 136 Administration des bases de données Création d’un profil CREATE PROFILE nom_profil LIMIT [SESSIONS_PER_USER{entier|UNLIMITED|DEFAULT}] [CPU_PER_SESSION {entier|UNLIMITED|DEFAULT}] [CPU_PER_CALL {entier|UNLIMITED|DEFAULT}] [CONNECT_TIME {entier|UNLIMITED|DEFAULT}] [IDLE_TIME {entier|UNLIMITED|DEFAULT}] [LOGICAL_READS_PER_CALL{entier|UNLIMITED|DEFAULT}] COMPOSITE_LIMIT {entier|UNLIMITED|DEFAULT}] PRIVATE_SGA {entier [K|M]|UNLIMITED|DEFAULT}] 137 Administration des bases de données Création de profil Quand une limite de ressource est atteinte pour un utilisateur, Oracle arrête l ’exécution en cours, annule la transaction et renvoie un code d’erreur. Exemple CREATE PROFILE maître LIMIT SESSIONS_PER_USER UNLIMITED CPU_PER_SESSION UNLIMITED CONNECT TIME 15 COMPOSITE_LIMIT 3500000; 138 Administration des bases de données Modification d’un Profil ALTER PROFILE nom_profil LIMIT ……….. Le coût de ressources est positionné pour une base par : ALTER RESSOURCE COST CPU_PER_SESSION entier CONNECT_TIME entier LOGICAL_READS_PER_SESSION entier PRIVATE_SGA entier ; ex. ALTER RESSOURCE COST CPU_PER_SESSION 150 CONNECT_TIME 2; Suppression : DROP PROFILE nom_profile [CASCADE] 139 Administration des bases de données Les utilisateurs 140 Définir son identité (nom et mot de passe), environnement. CREATE USER utilisateur IDENTIFIED {BY mot_passe |EXTERNALLY} [DEFAULT TABLESPACE tablespace] [TEMPORARY TABLESPACE tablespace] [QUOTA {entier [K|M] |UNLIMITED} ON tablespace] [PROFILE profile] Administration des bases de données Les utilisateurs Modification ALTER USER utilisateur IDENTIFIED {BY mot_passe |EXTERNALLY} [DEFAULT TABLESPACE tablespace] [TEMPORARY TABLESPACE tablespace] [QUOTA {entier [K|M] |UNLIMITED} ON tablespace] [PROFILE profile] [DEFAULT RÔLE {rôle[,rôle] …|ALL [EXCEPT rôle [,rôle]..] |NONE]} Suppression : DROP USER utilisateur [CASCADE] 141 Administration des bases de données Les privilèges d’accès L’accès à la base et la définition de ses objets « privilèges système ». TABLE, USER,VIEW, TRIGGER La manipulation d’objets de la base de données « privilèges objets » 142 ALTER, DELETE, INSERT, SELECT, UPDATE… Administration des bases de données Les privilèges Système GRANT {priv_sys |rôle}[, priv_sys |rôle].. TO {user|rôle|PUBLIC}[, user|rôle|PUBLIC]..[WITH ADMIN OPTION] GRANT CREATE TABLE, CREATE USER TO user1 REVOKE {priv_sys |rôle}[, priv_sys |rôle].. FROM {user|rôle|PUBLIC}[, user|rôle|PUBLIC].. 143 REVOKE CREATE USER FROM user1; Administration des bases de données Les privilèges Objets GRANT priv_obj[, priv_obj].. [(colonne[,colonne]..)] ON [shéma.]objet TO {user|rôle|PUBLIC}[, user|rôle|PUBLIC]..[WITH GRANT OPTION] Tous les privilèges avec ALL ou ALL PRIVILEGES. GRANT SELECT,INSERT ON user1.commande to user2 WITH GRANT OPTION. REVOKE priv_obj[, priv_obj].. [(colonne[,colonne]..)] ON [shéma.]objet FROM {user|rôle|PUBLIC}[, user|rôle|PUBLIC].. [CASCADE CONSTRAINTS] 144 Administration des bases de données Rôles Un rôle est une agrégation de droits d ’accès aux données et de privilèges système qui renforce la sécurité et réduit significativement la difficulté et le coût de son administration. La création d ’un rôle peut servir deux aspects : application et utilisateurs 145 Rôle application regroupe tous les privilèges nécessaires à l’exécution d ’une application. Rôle utilisateur gère des privilèges communs nécessaires aux utilisateurs de la base. Administration des bases de données user1 user2 Rôle vente Rôle STOCK Privilèges de l’application STOCK 146 user1 Rôle admin user4 Rôle paie Rôle PERSONNEL Privilèges de l’application PERSONNEL Administration des bases de données user5 Rôles Utilisateurs Rôles application Privilèges Applications Rôles CREATE ROLE rôle [NOT IDENTIFIED |IDENTIFIED {BY mot_passe |EXTERNALLY} CONNECT, RESSOURCE et DBA. L ’importation et l ’exportation de données: IMP_FULL_DATABASE et EXP_FULL_DATABASE SET ROLE {rôle [IDENTIFIED BY mot_passe][,rôle [IDENTIFIED BY mot_passe]]… | ALL [EXCEPT rôle [,rôle]…|NONE} ALTER ROLE rôle {NOT IDENTIFIED | IDENTIFIED {BY mot_passe |EXTERNALLY}} DROP ROLE rôle 147 Administration des bases de données