ECAM BASES DE DONNEES INTRODUCTION À SQL - *DB3T* - ICHEC Moodle

La page est créée Yves Dumont
 
CONTINUER À LIRE
ECAM BASES DE DONNEES INTRODUCTION À SQL - *DB3T* - ICHEC Moodle
ECAM

         BASES DE DONNEES
       INTRODUCTION À SQL

                     *DB3T*

Edition 2018                                M. De Vuyst, A. Lorge

               © TOUS DROITS DE REPRODUCTION RESERVES
ECAM BASES DE DONNEES INTRODUCTION À SQL - *DB3T* - ICHEC Moodle
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,-
ECAM BASES DE DONNEES INTRODUCTION À SQL - *DB3T* - ICHEC Moodle
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,-
ECAM BASES DE DONNEES INTRODUCTION À SQL - *DB3T* - ICHEC Moodle
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,-
ECAM BASES DE DONNEES INTRODUCTION À SQL - *DB3T* - ICHEC Moodle
! ! 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