ECAM BASES DE DONNEES INTRODUCTION À SQL - *DB3T* - ICHEC Moodle
←
→
Transcription du contenu de la page
Si votre navigateur ne rend pas la page correctement, lisez s'il vous plaît le contenu de la page ci-dessous
ECAM BASES DE DONNEES INTRODUCTION À SQL *DB3T* Edition 2018 M. De Vuyst, A. Lorge © TOUS DROITS DE REPRODUCTION RESERVES
1 Rappel des notions de base de données..............................................................................4 1.1 Notion de SGBD (Système de Gestion de Bases de Données).......................................... 4 1.2 Le langage SQL – Exemples de base.................................................................................. 5 1.3 La programmation d’application..................................................................................... 16 1.4 Architecture des systèmes applicatifs.............................................................................. 16 2 Intégrité des données........................................................................................................18 2.1 Conception d’une base de données : quelques pistes de réflexion ................................ 18 2.2 Définitions........................................................................................................................... 19 2.3 Qui est responsable des contraintes d’intégrité ?........................................................... 20 2.4 Modélisation....................................................................................................................... 20 2.5 Sources de corruption d’une base de données ............................................................... 21 3 Transactions – mode connecté.........................................................................................22 3.1 Définitions........................................................................................................................... 22 3.2 Les primitives..................................................................................................................... 22 3.3 Définition d’une transaction............................................................................................. 23 3.4 Structures de transaction.................................................................................................. 23 3.5 Hiérarchie des transactions .............................................................................................. 26 3.6 Transaction et Intégrité..................................................................................................... 27 3.7 Transactions multi-instructions et gestion d’erreur. ...................................................... 29 4 Protection contre les incidents : journal et sauvegarde..................................................30 4.1 Exposé du problème........................................................................................................... 30 4.2 Gestion des tampons........................................................................................................... 30 4.3 Sauvegarde (Backup)......................................................................................................... 31 4.4 Journal (Log File)............................................................................................................... 32 4.5 Choix du matériel .............................................................................................................. 34 5 Régulation de la concurrence ..........................................................................................35 5.1 Principes ............................................................................................................................. 35 5.2 Exemples de concurrence.................................................................................................. 35 5.3 Sérialisabilité...................................................................................................................... 37 5.4 Techniques de verrouillage............................................................................................... 38 5.5 Problème de l’interblocage ............................................................................................... 41 5.6 Règles à suivre pour éviter des problèmes de blocage :................................................. 43 5.7 Choix des niveaux d’isolation pour SQL Server : .......................................................... 43 6 Gestion de l’intégrité : résumé..........................................................................................44 6.1 Architecture de validation ................................................................................................ 44 6.2 Techniques natives............................................................................................................. 45 6.3 Prédicats ............................................................................................................................. 45 6.4 Triggers – déclencheurs ou reflexes................................................................................. 46 6.5 Vues avec vérifications (Views with check option)......................................................... 48 6.6 Procédures stockées........................................................................................................... 49 1ère licence EI – Bases de données SQL – page 2,-
6.7 Modules d’accès ................................................................................................................. 49 6.8 Sections de codes distribuées dans les programmes d’application............................... 50 6.9 Procédures de validation attachées aux écrans de saisie................................................ 50 6.10 Programmes de validation avant chargement................................................................ 50 6.11 Programmes de validation après chargement................................................................ 50 6.12 Comportement en cas de violation .................................................................................. 51 7 Processeur de requêtes – aspect technique......................................................................52 7.1 Missions du processeur de requêtes.................................................................................. 52 7.2 Types d’optimisations des requêtes................................................................................... 52 7.3 Techniques d’exécution des requêtes................................................................................ 53 7.4 Optimisation des requêtes.................................................................................................. 55 7.5 Outils d’optimisation......................................................................................................... 57 8 Interfaces standardisées d’accès aux données (développement) ....................................58 8.1 Enoncé du problème........................................................................................................... 58 8.2 Approches propriétaires. .................................................................................................. 59 8.3 ODBC : Open DataBase Connectivity.............................................................................. 61 8.4 JDBC : Protocole « indépendant ».................................................................................... 64 8.5 OLE – DB : Approche «objets» microsoft........................................................................ 66 9 Bibliographie.....................................................................................................................70 10 Annexe : Aide mémoire - SQL Server ..........................................................................71 10.1 Etapes à suivre pour la conception de la base de données ............................................ 71 10.2 Conception des tables........................................................................................................ 72 10.3 Création des tables............................................................................................................ 73 10.4 Création des index............................................................................................................. 74 10.5 Création des vues .............................................................................................................. 75 10.6 Création de procédures stockées ..................................................................................... 75 10.7 Création de déclencheurs ................................................................................................. 76 10.8 Transact – SQL – instructions principales..................................................................... 78 10.9 Procédures stockées simulant les mises à jour cascadées.............................................. 80 Les notes ci-après sont partiellement inspirées d’un séminaire DB-Main des Facultés Universitaires Notre Dame de la Paix à Namur. (Avec l’autorisation de l’auteur) 1ère licence EI – Bases de données SQL – page 3,-
1 Rappel des notions de base de données 1.1 Notion de SGBD (Système de Gestion de Bases de Données) Un SGBD peut être perçu comme un ensemble de logiciels système permettant les opérations suivantes Définir des structures de données complexes modélisant des objets du monde réel ou des associations entre objets. Insérer, modifier, rechercher efficacement des données spécifiques dans une grande masse d’informations. Les objets accessibles sont partagés par de multiples utilisateurs, aussi bien en interrogation qu’en mise à jour. Chaque utilisateur doit avoir l’illusion d’être seul à manipuler les données. Il faut pouvoir lui accorder des droits d’accès de manière très fine. Les recherches peuvent être exécutées à partir de la valeur d’une donnée désignée par un nom dans un ensemble d’objets nommés (par exemple ensemble des claviers inférieurs à 400 F), mais aussi à partir de relations entre objets (par exemple produits commandés par un client habitant telle localité). Les données doivent être protégées contre tout incident. Les performances doivent être acceptables, et auto adaptatives (gestion mémoire fonction de la charge par exemple). Des systèmes de sauvegardes doivent être prévus. Le SGBD doit être capable de comprendre des requêtes faites à l’aide d’un langage unifié de description et de manipulation des données (par exemple en SQL) On parlera de DDL : Data Definition Language et de DML : Data Manipulation Language EN PRATIQUE : Une base de données sera constituée d’une collection d’objets tels que des tables, des vues et des procédures stockées. Chaque base de données a son propre journal des transactions et garantit l’intégrité de tous les objets qui la composent. Des gestionnaires de bases de données relativement primitifs (dBASE, ACCESS …) travaillent surtout de manière séquentielle en ce qui concerne le stockage des informations. Ces gestionnaires se prêtent particulièrement bien à des recherches et des parcours de type « scrolling » où on fait défiler les pages de données à l’écran. Ils ne sont par contre pas adaptés à des recherches complexes, puisqu’ils impliquent généralement un parcours de toutes les tables. Les systèmes plus élaborés stockeront leurs informations dans des tables organisées sous forme d’arbres binaires et permettront de renvoyer aux utilisateurs uniquement les enregistrements demandés (Orientés « jeu de résultats »).Ils ne seront par contre pas très performants pour les traitements purement séquentiels. 1.2 Le langage SQL – Exemples de base 1.2.1 Définition et modification des structures de la BD (DDL – Data Definition Language) Création de tables, de colonnes, de clés (primaires et étrangères). create table CLIENT ( NCLI char(4) not null, NOM char(12) not null, ADRESSE char(20) not null, LOCALITE char(12) not null, CAT char(2), COMPTE decimal(9,2) not null, primary key (NCLI) ) 1ère licence EI – Bases de données SQL – page 4,-
! ! not null , primary key create table COMMANDE ( NCOM char(4) not null, NCLI char(4) not null, DATE date not null, primary key (NCOM), foreign key (NCLI) references CLIENT on delete cascade ) ! ! not null, primary key, foreign key, delete cascade create table DETAIL ( NCOM char(4) not null, NPRO char(5) not null, QCOM decimal(4) not null, primary key (NCOM, NPRO), foreign key (NCOM) references COMMANDE, on delete restrict foreign key (NPRO) references PRODUIT ) ! ! not null, primary key, foreign key – delete restrict Toutes les manipulations de création de bases de données peuvent généralement se faire avec des outils visuels permettant de créer automatiquement des scripts SQL, qui peuvent être stockés sous forme de fichiers textes. Voir ci-après : exemple Access. 1ère licence EI – Bases de données SQL – page 5,-
Suppression et modification de tables drop table DETAIL 1ère licence EI – Bases de données SQL – page 6,-
alter table PRODUIT add POIDS smallint alter table PRODUIT drop PRIX alter table CLIENT add primary key (NCLI) alter table COMMANDE add foreign key FK-CLI (NCLI) references CLIENT Création/suppression d'index create index XLOC on CLIENT (LOCALITE asc) create unique index XLIGNE on DETAIL (NCOM,NPRO) drop index XLIGNE 1.2.2 Modification des données de la BD (DML – Data Manipulation Language) Consultation / extraction des données select NCLI, NOM from CLIENT where LOCALITE ='BRUXELLES' select 'TVA de ', NPRO, ' = ', 0.21*PRIX*QSTOCK from PRODUIT where QSTOCK > 500 select 'Namur', avg(COMPTE), count(*) from CLIENT where LOCALITE = 'Namur' select NCOM,DATE from COMMANDE where NCLI in(select NCLI from CLIENT where LOCALITE = 'Namur') select NCOM, NCLI, DATE, NOM, ADRESSE from COMMANDE, CLIENT where COMMANDE.NCLI = CLIENT.NCLI and CAT = 'C1' and DATE < '15/03/2018' -- afficher toutes les informations des clients de catégorie C1 ayant -- effectué des commandes avant mars 2018. select NCLI, count(*), sum(QCOM) from COMMANDE C, DETAIL L where C.NCOM = L.NCOM and NPRO = 'PA60' group by NCLI having count(*) >= 2 order by NCLI -- Recherche des N° de client, du nombre de produits commandé et du -- montant total pour les clients ayant commandé plus de 2 produits PA60. Modification des données insert into COMMANDE values ('191','S712','12/04/2018') insert into TABLE_CLIENT_BRUXELLES select NCLI, NOM, ADRESSE from CLIENT where LOCALITE = 'BRUXELLES' -- pas toujours possible (ACCESS) delete from DETAIL where NPRO = 'PA60' update PRODUIT 1ère licence EI – Bases de données SQL – page 7,-
set PRIX = PRIX * 1.05 where LIBELLE like '%SAPIN%' update PRODUIT P /* P devient synonyme de PRODUIT */ set QSTOCK = QSTOCK – ( select sum(QCOM) from DETAIL D where D.NPRO = P.NPRO and D.NCOM in ( select NCOM from COMMANDE where DATE >= '01/01/2018' ) ) -- Ajustement du stock de produits en enlevant les quantités commandées -- après le 1er janvier 2018. Définition de vues create View HABITUDE_ACHAT(LOCALITE, NPRO, VOLUME) as select LOCALITE, P.NPRO, sum(QCOM*PRIX) from CLIENT L, COMMANDE C, DETAIL D, PRODUIT P where C.NCLI = L.NCLI and D.NCOM = C.NCOM and P.NPRO = D.NPRO group by LOCALITE, P.NPRO -- Afficher pour chaque localité les références de chaque produit avec -- le nombre de produits commandés. create view CLI(NCLI,NOM,ADR,LOC,CAT,CPTE) as select NCLI,NOM,ADR,LOC,CAT,CPTE from CLIENT where CAT is null or CAT in ('B1','B2','C1','C2') with check option -- la vue est «vivante», et peut subir des modifications et insertions. -- Le with check option interdit d’y insérer des valeurs différentes de NULL ou -- B1 à C2 pour la catégorie. 1ère licence EI – Bases de données SQL – page 8,-
Des outils automatiques de création de vues peuvent être employés. -- INNER JOIN … ON … est équivalent à FROM annétu, branches WHERE ….. Contrôles d’accès (privilèges) grant select, update(QSTOCK) on PRODUIT to GPERS2, FINCT grant all on CLIENT to GPERS2, FINCT with grant option grant run on COMPTA01 to GES66 revoke update(QSTOCK) on PRODUIT from GPERS2 1ère licence EI – Bases de données SQL – page 9,-
Les prédicats ou contraintes Un prédicat (ou contrainte) est une condition faisant partie du dictionnaire de la base de données qui sera vérifiée automatiquement après chaque modification. Certains gestionnaires de bases de données distinguent les contraintes (modification de colonne ou de table) des assertions (évaluation au niveau de la base de données – inter-tables, éventuellement liées à des utilisateurs) create assertion ASSERTION_COMDET check ( (select count(*) from COMMANDE where NCOM not in (select NCOM from DETAIL)) > 0 ) -- N’accepter aucune commande sans au moins un détail. alter table DETAIL add constraint C_QCOM check(QCOM > 0) -- La quantité commandée doit être > 0 alter table CLIENT add constraint C_SEXE check(SEXE is null or SEXE in ('M','F')) -- sans commentaire alter table DETAIL add constraint C_Q check(QCOM
procédures stockées (stored procedures) font partie du schéma de la base de données, et le gestionnaire peut non seulement stocker le code pré-compilé (gain de temps), mais également stocker les éléments lui permettant d’optimiser leur exécution. Permet également de placer dans la base de données des éléments faisant partie de la logique d’entreprise, sans duplication de code. Exemple La procédure ci-dessous supprime la ligne de détail dont elle reçoit le numéro de commande et le numéro de produit. Si cette ligne est la dernière de sa commande, cette dernière est également supprimée. create procedure MAJ_CMD (in COM char(4), in PRO char(5)) begin delete from DETAIL where NCOM = COM and NPRO = PRO ; if (select count(*) from DETAIL where NCOM = COM) = 0 then delete from COMMANDE where NCOM = COM end if ; end ; On pourra invoquer cette procédure par la commande suivante . CALL MAJ_CMD(182,'PA60') Autre exemple : appel d’une procédure « système » Le champ Numéro édition devient Numero edition EXECUTE sp_rename 'dbo.[Stock syllabus].[Numéro édition]', 'Tmp_Numéro edition', 'COLUMN' GO EXECUTE sp_rename 'dbo.[Stock syllabus].[Tmp_Numéro edition]', 'Numéro edition', 'COLUMN' GO 1ère licence EI – Bases de données SQL – page 11,-
Accès particulier aux données : les curseurs En principe, les opérations «SELECT WHERE» sur les bases de données relationnelles renvoient toujours un ensemble complet de lignes(modèle ensembliste - jeux de résultats). Les programmes utilisant la base de manière interactive et en ligne ne peuvent pas fonctionner efficacement avec un bloc de plusieurs milliers de lignes. Il est plus pratique de travailler avec un petit ensemble de lignes à la fois. Les curseurs mettent en place un mécanisme permettant d’envoyer à l’utilisateur un ensemble de lignes sélectionnées une par une (modèle séquentiel). Les systèmes modernes de gestion de bases de données proposent une fusion des 2 modèles d’accès aux informations (ensembliste et séquentiel) Il existe des curseurs spécialisés pour les accès ODBC ou OLE-DB, qui renvoient en une fois un petit nombre d’enregistrements. Attention, l’utilisation des curseurs dans le cadre des mises à jour est dangereuse (blocage d’enregistrements) ; des curseurs spéciaux existent pour gérer les appels Ole_DB ou ODBC. Opérations possibles : • Positionnement à une ligne donnée de l’ensemble de résultats. • Extraction d’une ligne ou d’un bloc de lignes. • Modifications possibles pour la ligne à la position courante. • Permet d’appliquer plusieurs niveaux de visibilité pour les changements effectués par les autres utilisateurs. • SQL Server© supporte 2 méthodes pour demander un curseur: • Transact-SQL: la syntaxe d’accès aux curseurs se base sur la norme SQL-92. • Fonctions de curseurs suivant les standards API suivants : • OLE DB • ODBC (Open Database Connectivity) • ADO (ActiveX Data Object) • DB-Library Procédure utilisée : 1. Associer un curseur à un ensemble résultat d’une commande select et en définir les caractéristiques (mise à jour possible par exemple). 2. Exécuter la commande SQL pour initialiser et remplir le curseur. 3. Récupérer les lignes du curseur intéressantes (fetch). 4. Eventuellement, mettre à jour la ligne de la position courante du curseur. 5. Fermer le curseur. 1ère licence EI – Bases de données SQL – page 12,-
En Transact-SQL, l’utilisateur doit attendre d’avoir reçu et récupéré l’ensemble complet des résultats avant de pouvoir faire autre chose. Il n’y a utilisation de curseur que quand on utilise la commande DECLARE CURSOR associée avec un SELECT. En ODBC, OLE DB ou ADO, l’utilisation des curseurs est souvent implicite pour toutes les opérations. Curseurs – déclaration simple DECLARE authors_cursor CURSOR FOR SELECT * FROM authors OPEN authors_cursor FETCH NEXT FROM authors_cursor -- ....... Curseurs : exemple d’utilisation avec parcours USE pubs GO DECLARE authorcursor CURSOR FOR SELECT au_fname, au_lname FROM authors ORDER BY au_fname, au_lname OPEN authorcursor FETCH NEXT FROM authorcursor WHILE @@FETCH_STATUS = 0 BEGIN -- ...... FETCH NEXT FROM authorcursor END CLOSE authorcursor DEALLOCATE authorcursor GO 1ère licence EI – Bases de données SQL – page 13,-
Curseurs : exemple avec double parcours DECLARE @au_id varchar(11), @au_fname varchar(20), @au_lname, varchar(40),@message varchar(80), @title varchar(80) PRINT "-------- Utah Authors report --------" DECLARE authors_cursor CURSOR FOR SELECT au_id, au_fname, au_lname FROM authors WHERE state = "UT" ORDER BY au_id OPEN authors_cursor FETCH NEXT FROM authors_cursor INTO @au_id, @au_fname, @au_lname WHILE @@FETCH_STATUS = 0 BEGIN PRINT " " SELECT @message = "----- Books by Author: " + @au_fname + " " + @au_lname PRINT @message -- Declare an inner cursor based on au_id from outer cursor. DECLARE titles_cursor CURSOR FOR SELECT t.title FROM titleauthor ta, titles t WHERE ta.title_id = t.title_id AND ta.au_id = @au_id -- Variable value from outer cursor OPEN titles_cursor FETCH NEXT FROM titles_cursor INTO @title IF @@FETCH_STATUS 0 PRINT " " WHILE @@FETCH_STATUS = 0 BEGIN SELECT @message = " " + @title PRINT @message FETCH NEXT FROM titles_cursor INTO @title END CLOSE titles_cursor DEALLOCATE titles_cursor -- Get the next author. FETCH NEXT FROM authors_cursor INTO @au_id, @au_fname, @au_lname END CLOSE authors_cursor DEALLOCATE authors_cursor GO --------- Utah Authors report -------- ----- Books by Author: Anne Ringer The Gourmet Microwave Is Anger the Enemy? ----- Books by Author: Albert Ringer Is Anger the Enemy? Life Without Fear 1ère licence EI – Bases de données SQL – page 14,-
Possibilités d’optimaliser les requêtes SQL. Les gestionnaires modernes permettent facilement d’évaluer le temps mis pour les différentes opérations impliquées par des requêtes. Ils peuvent même mémoriser dans une base de données les statistiques d’accès aux différents objets. 1ère licence EI – Bases de données SQL – page 15,-
1.3 La programmation d’application A condition d’avoir chargé les bonnes librairies dll (OLE DB ou ODBC), les programmes d’application peuvent utiliser directement les outils SQL. 2 modes d’utilisation fondamentalement différents sont prévus • Mode connecté (travail « en direct » vers la DB) • Mode déconnecté (travail sur une copie locale en mémoire) L’évolution actuelle de l’informatique, avec Internet, se fait plutôt en privilégiant le mode déconnecté. MAIS Les données sont copiées en mémoire (gourmand en ressources), et doivent s’y trouver en totalité (imaginons une table avec 1.000.000 de lignes …) ; lors de la mise à jour, on risque des problèmes de concurrence … il faudra vérifier chaque ligne modifiée pour voir si « quelqu’un d’autre » n’a pas modifié la même ligne entretemps. Il est à noter que des outils existent pour automatiser quelque peu le travail. 1.4 Architecture des systèmes applicatifs. Application monolithique Interface Traitement Accès aux utilisateur données Le programme comprend à la fois l’interface utilisateur, le traitement comprenant la « logique commerciale » du produit, et les données. Typiquement, il y a un seul exécutable qui effectue toutes les opérations. Il n’y a dès lors aucune réutilisation possible des composants mis en œuvre. (FAT CLIENT) 1ère licence EI – Bases de données SQL – page 16,-
Le programme comprend l’interface utilisateur et la « logique commerciale » du produit. Les traitements de données sont délégués au gestionnaire de bases de données, qui peut se charger de la plupart des vérifications liées à l’intégrité des données. Il peut également prendre en compte une partie de la logique commerciale de par sa capacité d’utilisation des «réflexes », ou déclencheurs. (Emission automatique de documents en fonction de l’état des bases de données, lancement de routines particulières synchronisées avec des événements particuliers). Le client reste relativement important et complexe, avec peu de réutilisation possible des composants. (MEDIUM CLIENT) 1ère licence EI – Bases de données SQL – page 17,-
2 Intégrité des données 2.1 Conception d’une base de données : quelques pistes de réflexion Tables En supposant que les données à stocker sont bien définies (discussions avec les utilisateurs), comment créer des tables ? • Toujours créer des tables avec un index unique (clé primaire) • Eviter absolument les redondances d’information : ex : l’adresse du client doit se trouver en 1 seul endroit • Si on a 2 éléments identiques de même poids (2 adresses, 2 résultats scolaires …) : toujours travailler avec 2 tables, la table maître contenant le client avec un identificateur unique, la table détail contenant les adresses référencées par le même identificateur (relation 1 à n) • Eviter le plus possible les recherches avec like «%…..%», qui imposent un parcours séquentiel coûteux, sans possibilité d’optimalisation. Dans ce cas, découper le champ en 2 parties. Exemple, dans une adresse, ne pas mélanger le code postal et la commune, mais mettre un champ code postal, et un champ commune • Toute liaison 1 à 1 pourrait probablement être fusionnée en une seule table • Toute liaison n à m impose nécessairement le recours à une table intermédiaire : exemple : lien Professeurs – Syllabus 1 professeur peut écrire plusieurs ouvrages 1 ouvrage peut être écrit par plusieurs professeurs Index • Choisir les clés primaires de façon efficace : les clés à incrémentation automatique qui imposent toujours la manipulation de plusieurs tables en maître-détail ; exemple : table des branches et des composantes – ce n’est pas très critique, mais on peut aussi créer des index sur base de champs multiples Chacune des tables peut être manipulée de façon indépendante ; des recherches possibles. par année académique ou par année d’études sont Les 2 tables sont définitivement liées entre elles, la seule façon de faire des sélections sur l’année d’études est de passer par les branches. 1ère licence EI – Bases de données SQL – page 18,-
2.2 Définitions Intégrité (théorique) Etat d'une base de données qui constitue une image fidèle du domaine d'application. Remarque : impossible à vérifier. Intégrité (pratique) Etat d'une base de données qui respecte un ensemble de contraintes d'intégrité. Remarque : techniquement vérifiable; simulation imparfaite de l'intégrité théorique. Contrainte d'intégrité Propriété formelle que les données et leur évolution doivent respecter à défaut de quoi elles sont réputées corrompues. Contrainte d'intégrité statique Propriété formelle que les données doivent respecter à tout instant (ou à des instants prédéfinis), à défaut de quoi elles sont réputées corrompues. Définit les états valides. Contrainte d'intégrité dynamique Ensemble des transitions d'état d'un objet considérées comme valides. Toute transition non valide partant d'un état valide conduit à un état corrompu des données, même si cet état respecte toutes les contraintes d'intégrité statiques. Exemples de contraintes statiques - Les domaines : exemple : valeurs permises (Sexe : (‘M’,’m’,F’,’f’) intervalles date=(1/1/1970-31/12/1990) règles de formation : code =[A-Z][0-9]* valeurs exclues - Les identifiants : contraintes d’unicité. - Contraintes de coexistence : si un étudiant est inscrit, alors il a un login ECAM et réciproquement. - Contraintes d’exclusivité : une personne a soit un salaire horaire, soit un traitement mensuel, mais pas les deux. - Contrainte au-moins-un. - Contrainte exactement un. - Contraintes d’inclusion de rôle : on ne peut commander un produit chez un fournisseur que s’il propose ce produit. - Contraintes d’exclusions de rôles : une entreprise qui loue un immeuble n’en est pas propriétaire, et inversement. - Contraintes intra-objet : dans une même table, pour une même commande, la quantité livrée doit être inférieure ou égale à la quantité commandée. - Contraintes de redondance : il est parfois intéressant de recopier des adresses dans la table des commandes pour ne pas avoir à parcourir trop de tables. Exemple de contraintes dynamique L’attribut état-civil peut subir les transitions suivantes : C →M / M →S,D,V D →M / V →M / S →D,V 1ère licence EI – Bases de données SQL – page 19,-
2.3 Qui est responsable des contraintes d’intégrité ? Le SGBD prend explicitement en charge(DDL) certaines contraintes Domaine de valeurs Char(10), decimal(10,2), date Colonnes obligatoires Not null Identifiants Primary key, unique, unique index Clés étrangères Foreign keys On peut également programmer certaines contraintes Prédicats Check – assertions Déclencheurs Create triggers Procédures stockées Create procedure Les interfaces utilisateurs incluent en plus du code de validation des contraintes d’entreprise, mais avec un risque accru de mauvaise gestion. 2.4 Modélisation De nombreux outils permettent de modéliser les systèmes d’information de façon graphique et conviviale ; ils permettent de passer du modèle conceptuel des données au modèle relationnel correspondant. Cela permet facilement de créer des bases de données de façon pratiquement automatisée. 1ère licence EI – Bases de données SQL – page 20,-
2.5 Sources de corruption d’une base de données • Introduction de données valides mais incorrectes : 1500,- au lieu de 5100,-. Impossible à tester. • Données invalides : date de facturation antérieure à la date de commande • Fausse manœuvre de l’utilisateur : oubli de lancer une procédure, pause-café… • Erreur technique du logiciel (GPF, division par 0..) • Erreur logique : mauvaise traduction d’organigramme • Erreur de logiciel système (Bug SGBD) • Attaques ciblées, fraudes, malveillances • Attaques anonymes, virus • Interactions parasites entre 2 processus concurrents (2 programmes modifient la même donnée ; le dernier qui la réécrit a gagné) • Incident matériel (Panne) • Perte du support (Disque) • Destruction de l’installation (Naturel ou d’origine humaine) 1ère licence EI – Bases de données SQL – page 21,-
3 Transactions – mode connecté 3.1 Définitions Transaction : une transaction est l’unité fondamentale de traitement pour les accès à la base de données. Elle est en principe constituée de plusieurs commandes SQL qui lisent et mettent à jour des éléments de la base de données, mais la mise à jour effective ne se fait qu’à la fin de la transaction (commit). Même en cas de panne du matériel ou du programme qui accède à la base de données à distance, la transaction est toujours vue comme un tout. Elle possède nécessairement des propriétés A.C.I.D. : • Atomicité : l’ensemble des instructions de la transaction est soit exécuté complètement (succès), soit pas du tout (échec), mais jamais partiellement. Même en cas de panne de courant en cours de transaction, le système doit revenir à l’état précédent. • Cohérence : si la base de données était cohérente avant transaction, elle doit l’être après (respect des contraintes d’intégrité). • Isolation : la transaction doit s’effectuer comme si elle était seule à manipuler la base de données. Il ne peut pas y avoir d’interférences avec les autres utilisateurs. • Durabilité : si la transaction s’est terminée correctement, les modifications sont permanentes, même en cas de panne matérielle. 3.2 Les primitives Une instruction ou requête primitive jouit également des propriétés ACID. Le gestionnaire de base de données fera appel à la notion de transaction pour les traitements internes induits par les contraintes (cascade). Exemple : delete from CLIENT where NCLI = 'C400' Cette requête simpliste induira une transaction comportant énormément de modifications de la base de données : • Supprimer la ligne de CLIENT • L’effet CASCADE supprimera plusieurs lignes de COMMANDE • Qui induiront la suppression de plusieurs lignes de DETAIL • Modification des INDEX de CLIENT, COMMANDE, DETAIL A.C.I.D. doit être respecté dans ce cas de figure, sans interaction de l’utilisateur. Toutes les lignes en cours de modification doivent être protégées des autres utilisateurs. Il faut trouver un système pour pouvoir grouper des primitives : en effet la séquence suivante pose problème : Programme cafétéria Solution : 3.3 ……… (Si incident : OK) (Si Incident : OK) Enlever 1000 BEF au compte provision Primitive ( (Si incident : incohérence) Enlever 1000 BEF compte Provision Ajouter 1000 BEF sur la carte MESS Ajouter 1000 BEF sur carte MESS ) (Si incident : OK) (Si Incident : OK) Définition d’une transaction Une transaction est définie à l’aide de 3 primitives : • Ouverture : begin transaction 1ère licence EI – Bases de données SQL – page 22,-
• Clôture avec confirmation : commit transaction • Clôture avec annulation : rollback transaction Attention, certains SGBD n’ont pas de begin transaction explicite. Dès la première modification, il y a transaction. La modification suivante donne lieu à un commit automatique, et au redémarrage d’une transaction. A la déconnexion de la base de données, un rollback est lancé automatiquement. Attention, un programme qui attaque le SGDB doit gérer lui-même les transactions ; voici un exemple simple dans le cas du transfert d’argent vers un badge (portefeuille électronique): --Demander le matricule et la somme Get (‘matricule et somme :’,MAT,SOMME) ; Begin transaction Read(COMPTESPROV(NUM_MAT=MAT),RESULTAT) ; If (PAS TROUVE) then GOTO ERREUR ; RESULTAT.SOLDE := RESULTAT.SOLDE – SOMME ; Update(COMPTESPROV,RESULTAT) Read(CARTESMESS(NUM_MAT=MAT),RESULTAT) ; If (PAS TROUVE) then GOTO ERREUR; RESULTAT.SOLDE := RESULTAT.SOLDE + SOMME ; Update(CARTESMESS,RESULTAT) ; Commit transaction --FIN NORMALE et Sortie ERREUR : Rollback Transaction --Sortie 1ère licence EI – Bases de données SQL – page 23,-
3.4 Structures de transaction Le schéma habituel d’un traitement de base de données est le suivant : • Saisie des données, dialogue avec l’utilisateur • Validation avec contrôles dans la base de données • • Modifications de la base avec les données validées Préparation Acquisition données 1 Validation données 1 Mise à jour enregistrement 1 …… Acquisition données n Validation données n Mise à jour enregistrement n Clôture Exemple de structures : soit 2 opérations à faire simultanément Séquence simple : Acquisition donnée 1 Validation donnée 1 Mise à jour enregistrement 1 Acquisition donnée 2 Validation donnée 2 Mise à jour enregistrement 2 Décomposition 1 : Begin transaction Acquisition donnée 1 Validation donnée 1 Mise à jour enregistrement 1 Acquisition donnée 2 Validation donnée 2 Mise à jour enregistrement 2 Commit Transaction Problèmes : l’acquisition est effectuée pendant la transaction : syndrome de la pause café, et on pourrait avoir un problème de validation après écriture en base. Décomposition 2 : Begin transaction Acquisition donnée 1 Validation donnée 1 Acquisition donnée 2 Validation donnée 2 Mise à jour enregistrement 1 Mise à jour enregistrement 2 Commit Transaction Problème : l’acquisition est effectuée pendant la transaction : pause café 1ère licence EI – Bases de données SQL – page 24,-
Décomposition 2bis : Begin transaction Acquisition donnée 1 Acquisition donnée 2 Validation donnée 1 Validation donnée 2 Mise à jour enregistrement 1 Mise à jour enregistrement 2 Commit Transaction Problèmes : désynchronisation acquisition/validation et pause café Décomposition 3 : Acquisition donnée 1 Acquisition donnée 2 Begin transaction Validation donnée 1 Validation donnée 2 Mise à jour enregistrement 1 Mise à jour enregistrement 2 Commit Transaction Problème : désynchronisation acquisition/validation Décomposition 4 : Acquisition donnée 1 Acquisition donnée 2 Validation donnée 1 Validation donnée 2 Begin transaction Mise à jour enregistrement 1 Mise à jour enregistrement 2 Commit Transaction Problèmes : ce qui a été validé avant la transaction risque de ne plus être valable dans la transaction ; interaction des autres processus. Décomposition 5 : Acquisition donnée 1 Validation donnée 1 Acquisition donnée 2 Validation donnée 2 Begin transaction Contrôle données 1 Contrôle données 2 Mise à jour enregistrement 1 Mise à jour enregistrement 2 Commit Transaction Problème : consommation de ressources 1ère licence EI – Bases de données SQL – page 25,-
3.5 Hiérarchie des transactions • Programme hiérarchisé : call A Programme P call C call E call D Modules niv. 2 A: B: Modules niv. 3 C: D: E: Primitive de modification de données call B La structure des transactions ne ressemble pas du tout à ce modèle ; il n’existe pas de structure de sous- transaction. • Le même schéma sous forme de transaction deviendrait le suivant : Begin Transaction Commit Transaction call B call A P: A: call C B: call D call E C: D: E: Pour permettre un contrôle minimum, le schéma suivant peut être appliqué BEGIN TRAN A SAVE TRAN B ROLLBACK TRAN B COMMIT TRAN A Remarques : • Aucun automatisme n’est prévu, le programmeur doit lui-même déterminer les niveaux de transaction et les traitements d’erreur. • Si une opération comprise dans une transaction déclenche un trigger, l’exécution du trigger s’insère la plupart du temps dans la transaction à son point d’activation. Si le trigger échoue, la transaction est annulée. 3.6 Transaction et Intégrité • Une transaction doit garantir la cohérence de la base de données (ACID). Si la base de données est cohérente à l’entrée de la transaction, elle doit l’être à la sortie, soit dans le même état (abort), soit dans un nouvel état qui respecte aussi les contraintes d’intégrité (primary key, unique, foreign, not null, check). • Ceci pose un sérieux problème quand les contraintes ne sont satisfaites que suite à une séquence de plusieurs primitives. 1ère licence EI – Bases de données SQL – page 26,-
Exemples concrets : 1. Transfert d’un compte vers un autre : la somme des comptes est invariante. Après transfert vers le premier compte, la BD est incohérente. 2. Introduction de commandes non vides : après création de la commande, la base est nécessairement incohérente. Si l’expression des contraintes est non déclarée, pas de problème. Si on ne déclare que l’une des contraintes, il suffit de terminer par celle-là. Si l’expression d’au moins 2 contraintes est explicite, il n’y a pas de solution. (Pas de commande sans détail et pas de détail sans commande) Expression 1 : aucune contrainte Create table COMMANDE ( NCOM integer not null primary key, DATECOM date not null, NCLI integer not null ) ; Create table DETAIL( NCOM integer not null, NPRO integer not null, QCOM decimal (8,2) not null, primary key(NCOM,QCOM) ) Tout ordonnancement est acceptable. Begin TRANSACTION Insert into COMMANDE values (…) ; Insert into DETAIL values (…) Commit TRANSACTION Expression 2 : contrainte foreign key déclarée Create table COMMANDE ( NCOM integer not null primary key, DATECOM date not null, NCLI integer not null ) ; Create table DETAIL ( NCOM integer not null, NPRO integer not null, QCOM decimal (8,2) not null, primary key(NCOM, QCOM) foreign key (NCOM) references COMMANDE ) Un seul ordonnancement valable : Begin TRANSACTION Insert into COMMANDE values (…); Insert into DETAIL values (…) Commit TRANSACTION Begin TRANSACTION Insert into DETAIL values (…) -- ERREUR REFERENTIELLE Insert into COMMANDE values (…) ; Commit TRANSACTION 1ère licence EI – Bases de données SQL – page 27,-
Expression 3 : 2 contraintes déclarées Create table COMMANDE ( NCOM integer not null primary key, DATECOM date not null, NCLI integer not null, Check(NCOM in select NCOM from DETAIL) ); Create table DETAIL ( NCOM integer not null, NPRO integer not null, QCOM decimal (8,2) not null, primary key(NCOM,QCOM) foreign key (NCOM) references COMMANDE ) Aucune solution valable : Begin TRANSACTION Insert into COMMANDE values (…) ; -- ERREUR DE CHECK Insert into DETAIL values (…) Commit TRANSACTION Begin TRANSACTION Insert into DETAIL values (…) -- ERREUR REFERENTIELLE Insert into COMMANDE values (…) ; Commit TRANSACTION Solution : débrayer la vérification des contraintes pendant la transaction ALTER TABLE COMMANDE NOCHECK CONSTRAINT Dès que les données existent : ALTER TABLE COMMANDE CHECK CONSTRAINT Problème : Les données introduites ne sont pas testées ! ! Il faut dès lors les re-tester en renvoyant des modifications « bidon », en remettant les mêmes valeurs en UPDATE. Solution meilleure(Oracle) : à la création de table, il est possible de spécifier que la vérification des contraintes sera d’office reportée au commit des transactions. Create table COMMANDE ( NCOM integer not null primary key, DATECOM date not null, NCLI integer not null, Check(NCOM in select NCOM from DETAIL) Initially deferrable ) ; Create table DETAIL ( NCOM integer not null, NPRO integer not null, QCOM decimal (8,2) not null, primary key(NCOM,QCOM) foreign key (NCOM) references COMMANDE initially deferrable ) 3.7 Transactions multi-instructions et gestion d’erreur. Soit la séquence suivante (sql server – le premier élément inséré est une clé unique): BEGIN TRANSACTION Insert Test VALUES(1,1) Insert Test VALUES(1,2) -- Violation de clé unique Insert Test VALUES(2,2) COMMIT TRANSACTION GO 1ère licence EI – Bases de données SQL – page 28,-
Dans ce cas de figure, la transaction va insérer les 2 lignes correctes, et ne tiendra pas compte de la 2ème. En effet, aucune vérification d’erreur n’a été faite entre les 2 instructions. Une version correcte de cette transaction serait : BEGIN TRANSACTION Insert Test VALUES(1,1) If @@ERROR 0 GOTO TRAN_ABORT Insert Test VALUES(1,2) If @@ERROR 0 GOTO TRAN_ABORT Insert Test VALUES(2,2) If @@ERROR 0 GOTO TRAN_ABORT COMMIT TRANSACTION GOTO FIN TRAN_ABORT : ROLLBACK TRANSACTION FIN : GO Il est également possible de positionner un drapeau global à l’application, permettant d’avoir un comportement prévisible d’annulation de toute la transaction en cas de problème SET XACT_ABORT ON BEGIN TRANSACTION Insert Test VALUES(1,1) Insert Test VALUES(1,2) -- Violation de clé unique : annulation Insert Test VALUES(2,2) COMMIT TRANSACTION GO Le gestionnaire SQL travaille TOUJOURS de cette façon quand une instruction unique modifie plusieurs lignes (Atomicité) 1ère licence EI – Bases de données SQL – page 29,-
4 Protection contre les incidents : journal et sauvegarde 4.1 Exposé du problème En cas d’incident (fortuit ou intentionnel), la cohérence des données doit être garantie. Il faut pouvoir repérer les données corrompues. Les propriétés A(tomicité) et D(urabilité) des transactions relèvent de la protection contre les incidents. Atomicité : en cas d’incident au sein de la transaction, les modifications déjà réalisées doivent être défaites (rollback) Durabilité : en cas d’incident après la clôture de la transaction, les données doivent être remises au moins dans l’état où elles étaient à la sortie de la transaction. Deux fichiers annexes protègent la base de données : Le journal (LOG FILE) La sauvegarde (BACKUP) 4.2 Gestion des tampons Principe : Temps de transfert en mémoire : 10-7 sec (au plus) – Temps de transfert sur disque : 15msec (au mieux – le déplacement du bras se fait en 8msec dans les meilleurs cas). La mémoire va au moins 150.000 fois plus vite que le disque. EVITER ABSOLUMENT LES LECTURES ET ECRITURES SUR DISQUE ! TAMPON DISQUE Programme Donnée 0.1 microseconde 15000 microsecondes Il est intéressant d’avoir un tampon en mémoire très important, mais en cas d’incidents, la mémoire est définitivement perdue. Un schéma plus complet des échanges matériels est le suivant : Programme SGBD SYSTEME d’EXPLOITATION CONTRÔLEUR CACHE TAMPON TAMPON CONTROLEUR Programme Var Abcdefg0123 Abcdefg0123 DISQUE (Pistes Echange de secteurs et Secteurs) Echange Echange de pages d’enregistrements Echange de secteurs & pistes 1ère licence EI – Bases de données SQL – page 30,-
Pour accélérer au maximum le processus, des algorithmes LRU (Last Recently Used) sont mis en place pour gérer les accès aux tampons de mémoire. En cas de lecture : le SGDB détermine si l’enregistrement est disponible dans le tampon. Soit il s’y trouve : lecture instantanée, soit il ne s’y trouve pas : il y a recherche d’un cadre de stockage libre, avec 2 cas d’espèce : soit il y a un cadre libre, et l’enregistrement est lu sur le disque (1 seule lecture), soit il n’y a plus de place, et le cadre dont le contenu n’a plus été utilisé depuis le plus long temps est écrasé. (S’il a subi une modification, il y a écriture sur disque) En cas d’écriture : si l’enregistrement est disponible dans le tampon : mise à jour du tampon. S’il ne s’y trouve pas : même comportement que ci-dessus. On n’écrira les modifications sur disque que dans 4 cas : Le cadre doit être libéré (LRU) On demande la fermeture de la table ou de la BD Le programme décide de vider le tampon(flush) A la fin d’une transaction Conclusions Les données du tampon sont plus récentes que celles du disque Les données du disque sont incohérentes L’état courant de la base de données est constitué du tampon + le disque En cas d’incident et de perte de mémoire centrale, la base de données est corrompue On utilisera donc la technique du JOURNAL et du BACKUP pour garantir la cohérence. 4.3 Sauvegarde (Backup) Copie complète ou partielle de la base de données prise à un instant de référence Copie complète : version prête à l’emploi, demandant un temps très long pour sa fabrication Copie partielle ou incrémentale : on ne stocke que les modifications depuis la dernière copie complète ; rapide mais la reconstitution complète est nécessairement lente. La sauvegarde doit nécessairement être intégrée au SGBD, puisque celui-ci doit mémoriser de manière très précise l’instant de la sauvegarde. La plupart des gestionnaires de SGBD intègrent une fonction de sauvegarde automatisée, qui se lance à des moments choisis. L’intervenant humain n’a plus qu’à enlever la cassette. (On peut également répliquer des bases de données pour garantir la continuation du service) 4.4 Journal (Log File) Fichier séquentiel dans lequel sont consignées toutes les modifications de la base de données, ainsi que l’historique des transactions. Principe : On écrit anticipativement dans le journal avant de lancer une transaction (image «avant »). On effectue les opérations liées à la transaction . On écrit dans le journal après clôture de la transaction (image « après ») 1ère licence EI – Bases de données SQL – page 31,-
Vous pouvez aussi lire