Administration des bases de données



Documents pareils
Langage propre à Oracle basé sur ADA. Offre une extension procédurale à SQL

Module Administration BD Chapitre 1 : Surcouche procédurale dans les SGBDS

Gestion des utilisateurs et de leurs droits

Les Triggers SQL. Didier DONSEZ. Université de Valenciennes Institut des Sciences et Techniques de Valenciennes

TP Contraintes - Triggers

Bases de données et sites WEB

Bases de données avancées

CHAPITRE 4 POLITIQUES DE CONTRÔLES DES ACCÈS SOUS ORACLE ADMINISTRATION ET TUNING DE BASES DE DONNÉES 10/05/2015 RESPONSABLE DR K.

Bases de Données Avancées PL/SQL

ORACLE 10G DISTRIBUTION ET REPLICATION. Distribution de données avec Oracle. G. Mopolo-Moké prof. Associé UNSA 2009/ 2010

Cours Bases de données 2ème année IUT

COMMANDES SQL... 2 COMMANDES DE DEFINITION DE DONNEES... 2

Notes de cours : bases de données distribuées et repliquées

Bases de Données relationnelles et leurs systèmes de Gestion

//////////////////////////////////////////////////////////////////// Administration bases de données

Laboratoires de bases de données. Laboratoire n 6. Programmation SQL. par Danièle BAYERS et Louis SWINNEN

Cours 3. Développement d une application BD. DBA - Maîtrise ASR - Université Evry

Administration des Bases de Données Oracle

Bases de données et sites WEB Licence d informatique LI345

Intégrité des données

Le Langage De Description De Données(LDD)

Cours Bases de données 2ème année IUT

Devoir Data WareHouse

Cours Bases de données 2ème année IUT

Administration des bases de données. Jean-Yves Antoine

Gestion des transactions et accès concurrents dans les bases de données relationnelles

Langage SQL (1) 4 septembre IUT Orléans. Introduction Le langage SQL : données Le langage SQL : requêtes

Langage SQL : créer et interroger une base

Licence de MIDO - 3ème année Spécialités Informatique et Mathématiques Appliquées

420-PK6-SL Banques de données Avancées. UTILISATEURS (suite)

Auto-évaluation Oracle: cours de base

Le Langage SQL version Oracle

Intégrité sémantique dans les bases de données relationnelles

SGBDR. Systèmes de Gestion de Bases de Données (Relationnelles)

Bases de données Oracle Virtual Private Database (VPD) pour la gestion des utilisateurs d applications

CREATION WEB DYNAMIQUE

Olivier Mondet

Oracle Le langage procédural PL/SQL

Partie 0 : Gestion des tablespace et des utilisateurs... 3

A.E.C. GESTION DES APPLICATIONS TECHNOLOGIE DE L'INFORMATION LEA.BW

TP11 - Administration/Tuning

Techniques de stockage. Techniques de stockage, P. Rigaux p.1/43

Introduction au PL/SQL Oracle. Alexandre Meslé

A QUOI SERVENT LES BASES DE DONNÉES?

ECR_DESCRIPTION CHAR(80), ECR_MONTANT NUMBER(10,2) NOT NULL, ECR_SENS CHAR(1) NOT NULL) ;

Bases de Données Réparties

Gestion de base de données

A QUOI SERVENT LES BASES DE DONNÉES?

Présentation du PL/SQL

Corrigés détaillés des exercices

1. Qu'est-ce que SQL? La maintenance des bases de données Les manipulations des bases de données... 5

Le langage procédural PL-PGSQL

Le langage SQL pour Oracle - partie 1 : SQL comme LDD

Les transactions 1/46. I même en cas de panne logicielle ou matérielle. I Concept de transaction. I Gestion de la concurrence : les solutions

CHAPITRE 1 ARCHITECTURE

TP Administration Oracle

Du 10 Fév. au 14 Mars 2014

Présentation du module Base de données spatio-temporelles

Programme détaillé. Administrateur de Base de Données Oracle - SQLServer - MySQL. Objectifs de la formation. Les métiers

Quelques aspects du Relationnel-Objet du SGBD Oracle

Bases de Données Réparties Concepts et Techniques. Matthieu Exbrayat ULP Strasbourg - Décembre 2007

Procédures Stockées WAVESOFT ws_sp_getidtable Exemple : ws_sp_getnextsouche Exemple :... 12

Configurer la supervision pour une base MS SQL Server Viadéis Services

Plan de formation : Certification OCA Oracle 11g. Les administrateurs de base de données (DBA) Oracle gèrent les systèmes informatiques

Bases de Données Avancées

Partie II Cours 3 (suite) : Sécurité de bases de données

Introduction à JDBC. Accès aux bases de données en Java

COMPOSANTS DE L ARCHITECTURE D UN SGBD. Chapitre 1

Le langage SQL (première partie) c Olivier Caron

Création d'une nouvelle base de données

1/ Présentation de SQL Server :

Chapitre 5 : Les procédures stockées PL/SQL

AGRÉGATION «ÉCONOMIE ET GESTION»

Pour les débutants. langage de définition des données

Création et Gestion des tables

Partie I : Créer la base de données. Année universitaire 2008/2009 Master 1 SIIO Projet Introduction au Décisionnel, Oracle

PHP 5. La base de données MySql. A. Belaïd 1

Bases de données relationnelles

Secteur Tertiaire Informatique Filière étude - développement. Accueil. Apprentissage. Période en entreprise. Evaluation.

PROJET 1 : BASE DE DONNÉES REPARTIES

Introduction aux SGBDR

Table des matières PRESENTATION DU LANGAGE DS2 ET DE SES APPLICATIONS. Introduction

Utilisation de JAVA coté Application serveur couplé avec Oracle Forms Hafed Benteftifa Novembre 2008

Cours Bases de données

Notion de base de données

BASES DE DONNEES TP POSTGRESQL

Introduction au Système de Gestion de Base de Données et aux Base de Données

1 Position du problème

OpenPaaS Le réseau social d'entreprise

Historisation des données

Master Exploration Informatique des données DataWareHouse

Administration des bases de données relationnelles Part I

NFA 008. Introduction à NoSQL et MongoDB 25/05/2013

SQL Historique

Ora2Pg. Présentation, bonnes pratiques et futur du projet

FileMaker 13. Guide de référence SQL

4. Utilisation d un SGBD : le langage SQL. 5. Normalisation

RECOVERY MANAGER G. Mopolo-Moké prof. MBDS UNSA 2005/ 2006

Transcription:

Administration des bases de données Mehdi Louizi 1

Pourquoi PL/SQL 2

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

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

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 Ex : Forms et Report 5

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

Utilisation de PL/SQL Le PL/SQL peut être utilisé sous 3 formes 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) 7

Le langage PL/SQL 8

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

Structure d un programme PL/SQL DECLARE -- définition des variables BEGIN -- code du programme EXCEPTION -- code de gestion des erreurs END; 10

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

Déclaration, initialisation des variables Déclaration et initialisation Nom_variable type_variable := valeur; Initialisation Nom_variable := valeur; Déclaration multiple interdite Exemples: age integer; nom varchar(30); datenaissance date; ok boolean:= true; 12

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 : datenaissance:= 10/10/2004 ; SELECT nome INTO nom FROM emp WHERE matr= 509; 13

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

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 Exemple: num_tel number(10); farid number(5,2)=142.12; 15

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-MON- YYYY:HH24:MI ); BOOLEAN TRUE, FALSE ou NULL 16

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 : employe emp%rowtype; déclare que la variable employe contiendra une ligne de la table emp 17

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

Commentaires --Pour une fin de ligne /* Pour plusieurs lignes */ 19

PL /SQL : les principales commandes 20

Test conditionnel IF-THEN IF l_date > 11-APR-03 THEN l_salaire := l_salaire * 1.15; END IF; IF-THEN-ELSE IF l_date > 11-APR-03 THEN l_salaire := l_salaire * 1.15; ELSE l_salaire := l_salaire * 1.05; END IF; 21

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 CASE sélecteur WHEN expression1 THEN résultat1 WHEN expression2 THEN résultat2 ELSE résultat3 END; 22

Test conditionnel Exemple : val := CASE os WHEN WINDOWS THEN MICROSOFT WHEN LEOPARD THEN APPLE ELSE Unix END; 23

Exercices Soit la table départements avec les champs suivants : id_departement : clé primaire, entier non nul nom : varchar2(40) id_region : toujours nul Soit la séquence «dep» suivante : 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

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

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

Les boucles LOOP instructions exécutables; END LOOP; Obligation d utiliser la commande EXIT WHILE condition LOOP instructions exécutables; END LOOP; 27

Les boucles FOR variable IN debut..fin LOOP instructions; END LOOP; 28

Affichage Activer le retour écran set serveroutput on size 10000 Affichage dbms_output.put_line(chaîne); Utilise pour faire une concaténation 29

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

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

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

33 Les curseurs

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

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

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

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

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

Les curseurs Curseurs paramétrés 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) 39

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

41 Les exceptions

Les exceptions Une exception est une erreur qui survient durant une exécution 2 types d exception : prédéfinie par Oracle définie par le programmeur 42

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

Les exceptions prédéfinies NO_DATA_FOUND Quand Select into ne retourne aucune ligne TOO_MANY_ROWS Quand Select into retourne plusieurs lignes VALUE_ERROR Erreur numérique ZERO_DIVIDE Division par zéro OTHERS Toutes erreurs non interceptées 44

Traitement des exceptions BEGIN EXCEPTION WHEN NO_DATA_FOUND THEN... WHEN TOO_MANY_ROWS THEN... WHEN OTHERS THEN--optionnel... END; 45

Les exceptions Utilisateur Elles doivent être déclarées avec le type EXCEPTION On les lève avec l instruction RAISE 46

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

Procédures et Fonctions 48

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

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

Procédures avec paramètre create or replace procedure list_nom_clients (ville IN varchar2, result OUT number) 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; IN : en lecture seule OUT : en écriture seule IN OUT : en lecture/écriture 51

Récupération des résultats sous SQL+ Déclarer une variable SQL> variable nb number; Exécuter la fonction Une variable globale s utilise avec le préfixe : SQL> execute list_nom_clients('paris',:nb) Visualisation du résultat SQL> print Description des paramètres SQL> desc nom_procedure 52

Fonctions sans paramètres create or replace function nombre_clients return number IS Déclaration du type de retour de la BEGIN fonction DECLARE i number; CURSOR get_nb_clients IS select count(*) from clients; END; BEGIN END; open get_nb_clients; fetch get_nb_clients INTO i; return i; Exécution: select nombre_clients() from dual 53

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

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

Compilation, exécution et utilisation Compilation Sous SQL*PLUS, il faut taper une dernière ligne contenant «/»pour compiler une procédure ou une fonction Exécution Sous SQL*PLUS on exécute une procédure PL/SQL avec la commande EXECUTE : EXECUTE nomprocédure(param1, ); Utilisation 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 56

57 Triggers

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

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

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

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

Définition du trigger La définition du trigger précise la table associée au trigger : une et une seule table pas une vue. 62

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 : BEFORE, AFTER, FOR EACH ROW 63

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

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 : 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. 65

Triggers Le corps du trigger est un bloc PL/SQL : 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. 66

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

Les noms de corrélation La nouvelle valeur est appelée :new.colonne L'ancienne valeur est appelée :old.colonne Exemple : IF :new.salaire < :old.salaire... 68

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

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

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

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

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

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

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 Un trigger peut provoquer le déclenchement d'un autre trigger. ORACLE autorise jusqu'à 32 triggers en cascade à un moment donné. 75

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

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 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. 77

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

Activation d un trigger Pour désactiver un trigger, on utilise l instruction ALTER TRIGGER avec l option DISABLE : ALTER TRIGGER nomtrigger DISABLE; On peut désactiver tous les triggers associés à une table avec la commande : ALTER TABLE nomtable DISABLE ALL TRIGGERS; A l inverse on peut réactiver un trigger : ALTER TRIGGER nomtrigger ENABLE; ou tous les triggers associés à une table : ALTER TABLE nomtable ENABLE ALL TRIGGERS; 79

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

La procédure raise_application_error La procédure raise_application_error (error_number,error_message) 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. 81

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. 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. 82

Exceptions prédéfinies quelques exemples NO_DATA_FOUND cette exception est générée quand un SELECT INTO ne retourne pas de lignes DUP_VAL_ON_INDEX tentative d'insertion d'une ligne avec une valeur déjà existante pour une colonne à index unique ZERO_DIVIDE division par zéro etc 83

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

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

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

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

Quelques exemples 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, 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); 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

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

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

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

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

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

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

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 Oracle 96

Types d utilisateurs d une BD 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 97

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

Rôle du DBA Rôle organisationnel Définition du schéma conceptuel des données Partage des données par les utilisateurs Rôle technique Installation su SGBD et des outils associés Création de la base de données et assurer son évolution 99

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

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

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

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

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

Structure logique d une Base de Données Des tablespaces Des segments Des extensions Des blocs 105

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

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

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: se fait selon trois niveau de granularité: le segment, l extension et le bloc 108

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 Unité logique d allocation d espace composée d un ensemble contigu de blocs de données alloués simultanément à un segment 109

Segment Un ensemble d une ou plusieurs extensions contenant les données d une structure logique dans un tablespace 5 types de segments: Segments de données Segments d index Segments d annulation (rollback) Segments temporaires Segments d amorçage (bootstrap) 110

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. Evaluer l espace disque nécessaire prévoir les moyens assurant la sécurité de la base. 111

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