• Aucun résultat trouvé

Les vues

N/A
N/A
Protected

Academic year: 2022

Partager "Les vues"

Copied!
7
0
0

Texte intégral

(1)

Bases de données

Eléments de bases de données : Les entités faibles et les identifiants relatifs Le LDD (Langage de définition de données) La gestion de privilèges

Les vues

Les opérateurs ensemblistes La division SQL Les triggers (ou déclencheurs)

1 Ph. CHOCHOIS

Concept d'entité faible

Dans le modèle conceptuel, une entité représente un objet de gestion de l'organisation concernée. L'entité a donc une existence propre.

Dans la réalité, cette notion n’est pas toujours vraie. Certaines entités dépendent d’autres entités.

Exemple: Un immeuble et les salles qui le composent.

Page 2

Une salle n‘a pas d’existence propre. Elle n’existe seulement parce que l’immeuble existe.

Entité faible Entité forte

Concept d'entité faible

Règles de détermination des entités faibles:

L’entité faible n’existe que s’il y a présence d’une entité forte. La disparition de l’entité forte entraîne obligatoirement la disparition de l’entité faible.

La suppression d’occurrences de l’entité forte entraîne automatiquement la suppression des occurrences de l’entité faible qui lui étaient associées.

L’entité faible ne peut exister que s’il y a dépendance fonctionnelle forte et stable.

Dépendance fonctionnelle: L’entité faible est associé à une seule entité forte. La cardinalité maximale entre l’entité faible et l’association est à 1. Une salle n’est située que dans un immeuble.

Dépendance fonctionnelle forte: La cardinalité minimale est à 1. Une salle ne peut pas ne pas être située dans un immeuble.

Dépendance fonctionnelle stable: L’association entre 2 occurrences des entités ne peut pas évoluer. La salle ne peut pas changer d’immeuble !

Page 3

Concept d'entité faible Représentation d'une entité faible :

Soit on représente par des traits en pointillé.

Soit on représente par des doubles traits.

Soit on la représente comme une entité normale en précisant en commentaires que l’entité est faible.

Page 4

Identifiant relatif

Pour identifier l'objet, on utilise l'identifiant de l'entité forte associé à un identifiant permettant de d'identifier de façon unique chaque occurrence de l'entité faible.

Exemple:

Numéro d’étage : 3 Salle : 325 Numéro d’étage : 1 Salle : 111

Représentation: 2 solutions

Exercices d'application…

Exercice 1: Cas « Bibliothèque »

Un livre est identifié par un code artificiel délivré par la bibliothèque lors de la première entrée pour ce livre. Pour chacun, on note le nombre de pages et la date de dernière édition.

Pour un même livre, par exemple « Le malade imaginaire » de Molière, la bibliothèque achète plusieurs exemplaires, pas forcément tous à la même date ; ils sont alors en rayon.

Un abonné (numéro d’abonné, nom et prénom) n’emprunte pas un livre mais un exemplaire du livre, qui est repéré par un numéro (1, 2, 3 etc.) au sein du code du livre. On mémorisera les dates d’emprunt, de retour sachant qu’un abonné peut emprunter plusieurs fois le même livre.

Chaque livre est écrit par un ou plusieurs auteurs dont on enregistre, outre son

identité, ses dates de naissance et, éventuellement, de décès, ainsi que sa

nationalité. Chaque ouvrage est rattaché à un genre (Roman, Théâtre, Aventure,

Policier, Encyclopédie, Essai, Sciences etc.…)

(2)

Passage au modèle relationnel

LIVRES (codeLivre , nbPages , dateEdition , titre) codeLivre clé primaire de la table LIVRES

EXEMPLAIRES (#codeLivre , codeExemplaire , dateAchat) codeLivre , codeExemplaire clé primaire composée de la table EXEMPLAIRES codeLivre clé étrangère de la table EXEMPLAIRES qui référence codeLivre de la table LIVRES.

Page 7

Exercices d'application…

Exercice 3: Cas « Chantier »

Une entreprise est spécialisée dans la livraison de matériaux de toutes sortes à différents chantiers. Il faut connaître l’unité de mesure de ce matériau et son poids par unité.

Chaque camion a un code qui débute par celui du type auquel il appartient (camionnette, semi-remorque, camion-citerne, porte-engins…). Ce type est caractérisé par le code du permis nécessaire, le poids à vide, le poids total en charge et le volume utile.

Lors de chaque transport, le camion livre différents matériaux dans une certaine quantité. On doit connaître la date de transport.

De plus, chaque transport est identifié par un numéro d’ordre chronologique par rapport au chantier qu’il approvisionne

Page 8

LDD (Langage de Définition de Données)

Définition:

Nous avons travaillé auparavant avec le LMD (Langage de manipulation de données) en utilisant notamment les ordres:

• SELECT

• INSERT

• UPDATE

• DELETE

Le LMD manipule les données, c’est à dire le contenu des tables alors que le LDD manipule les éléments constituant la base de données elle-même.

Les objets que l’on pourra manipuler sont:

• des bases de données

• Des schémas

• Des tables

• Des indexs

• Des clusters

• Des sequences

• …/…

9

LDD (Langage de Définition de Données)

La gestion des tables:

Pour manipuler une table, nous disposons de 3 ordres:

• CREATE (Création)

• ALTER (Modification)

• DROP (Suppression)

10

LDD (Langage de Définition de Données)

Exemples des création de table : Il faut définir chaque attribut en indiquant:

• Son nom

• Son type

• Eventuellement les contraintes Chaque champ est séparé par une virgule

CREATE TABLE musicien(

numMusi integer primary key, nomMusi varchar(50) not null, instrument varchar(20));

CREATE TABLE fournisseurs(

nomFourni varchar(25), prenomFourni varchar(25), adresseFourni varchar(50), telFourni char(14),

constraint pk_Fournisseurs primary key (nomFourni , prenomFourni));

Ici la contrainte ne porte pas sur un champ mais sur plusieurs: C’est une contrainte de niveau table.

11

LDD (Langage de Définition de Données)

Exemples des création de table :

CREATE TABLE oeuvre(

numOeuvre integer primary key, nomOeuvre varchar(35), compOeuvre varchar(25),

numConc integer references concert(numConcert) on update cascade

on delete set null);

OU

CREATE TABLE oeuvre(

numOeuvre integer, nomOeuvre varchar(35), compOeuvre varchar(25), numConc integer,

constraint pk_Oeuvre primary key (numOeuvre),

constraint fk_oeuvre_concert foreign key (numConc) references concert(numConcert));

12

(3)

LDD (Langage de Définition de Données)

Exemples de modification de table :

ALTER TABLE musicien

ADD cachetMusi integer default 0;

ALTER TABLE musicien MODIFY cachetMusi numeric(5,2);

ALTER TABLE musicien DROP cachetMusi;

ALTER TABLE prix_option

ADD CONSTRAINT fk_prixoption_option FOREIGN KEY (id_option) REFERENCES options(id_option),

ADD CONSTRAINT fk_prixoption_modele FOREIGN KEY (id_modele) REFERENCES modele(id_modele);

13

LDD (Langage de Définition de Données)

Exemple d’utilisation de la contrainte check :

CREATE TABLE employe

( numEmploye integer PRIMARY KEY , nomEmploye varchar( 20 ) NOT NULL , prenomEmploye varchar( 15 ) ,

qualifEmploye varchar( 12 ) default 'Technicien'

CHECK (qualifEmploye IN ('Ouvrier','Technicien','Ingenieur','DG')), servEmploye integer

);

Exemple de suppression de table

DROP TABLE employe;

14

LCD (Langage de Contrôle des données) La gestion de privilèges

Objectifs:

Les bases de données ont pour objectif de pouvoir être accédées par de multiples utilisateurs simultanément.

Selon son profil, l’utilisateur peut n’être autorisé qu’à certaines opérations.

Il est possible grâce au LCD de mettre en place des privilèges d’accès aux bases de données.

Il est également possible de recourir à la gestion des vues pour garantir la confidentialité de certaines données.

15

LCD (Langage de Contrôle des données) La gestion de privilèges

Syntaxe d’attribution de privilèges: GRANT

1) Je veux autoriser l’utilisateur ‘Dupont’ à lire et à supprimer des lignes sur la table ‘Employe’.

GRANT SELECT , DELETE ON Employe TO Dupont;

2) Je veux permettre aux utilisateurs ‘Durand’ et ‘Dupuis’ d’insérer des valeurs dans les colonnes numEmploye, nom, prenom de la table ‘Employe’.

GRANT INSERT (numEmploye , nom , prenom) ON Employe

TO Dupont , Dupuis;

3) Je veux permettre à tout le monde de lire la table ‘Voiture’.

GRANT SELECT ON Voiture TO public;

16

LCD (Langage de Contrôle des données) La gestion de privilèges

Syntaxe d’attribution de privilèges: GRANT

Exercice: Autorisez l’utilisateur ‘Bokassa’ à supprimer des lignes sur la table ‘Diamant’.

GRANT DELETE ON Diamant TO Bokassa;

Question: Bokassa a-t-il le droit d’autoriser l’utilisateur ‘Valery’ à supprimer des lignes sur la table

‘Diamant’ ? Réponse: NON

Si je veux permettre à Bokassa de transmettre les droits que je lui donne, il faut ajouter l’option WITH GRANT OPTION.

GRANT DELETE ON Diamant TO Bokassa WITH GRANT OPTION;

LCD (Langage de Contrôle des données) La gestion de privilèges

Syntaxe de révocation de privilèges: REVOKE

1) Je veux supprimer les droits de lecture sur la table Employe pour ‘Dupont’.

REVOKE SELECT ON Employe FROM Dupont;

2) Je veux interdire à Bokassa de transmettre ses droits de supprimer des lignes sur la table Diamant.

REVOKE GRANT OPTION FOR DELETE ON Diamant

FROM Bokassa;

3) Je veux interdire à Bokassa d’insérer des lignes sur la table Diamant ainsi qu’à tous ceux à qui il a attribué des droits.

REVOKE INSERT ON Diamant FROM Bokassa CASCADE;

(4)

Bases de données

Les vues :

19 Ph. CHOCHOIS

Les vues

Définition:

Une vue est une table logique basée sur une table.

Une vue peut aussi être basée:

- Sur une vue - Sur un ensemble de tables - Sur un ensemble de vues - Sur un ensemble de vues et de tables

La vue affiche des données qui ne lui sont pas propres mais les données qui proviennent des autres tables (ou vues).

C’est comme une fenêtre qui permet de visualiser une partie (sélection de lignes ou de colonnes) des tables.

Les vues sont stockées dans le SGBD. Vous pouvez donc les réutiliser dans d’autres sessions.

20

Les vues

Exemple :

Voici une table CLIENT affichée grâce à la requête suivante:

« SELECT * FROM CLIENT; »

21 NCLI NOM ADRESSE LOCALITE CAT COMPTE

B112 HANSENNE 23 A. DUMONT POITIERS C11250.00 C123 MERCIER 25 RUE LEMAITRE NAMUR C1 -2300.00

B332 MONTI 112 RUE NEUVE GENEVE B2 0.00 F010 TOTO 5 RUE GODEFROID POITIERS C1 0.00

Je crée une vue nommée « CLIENT_P »qui me permet de sélectionner les nom et adresse des habitants de Poitiers.

J’obtiens l’affichage suivant grâce à la requête suivante:

« SELECT * FROM CLIENT_P; »

NOM ADRESSE

HANSENNE 23 A. DUMONT TOTO 5 RUE GODEFROID

Les vues

Syntaxe :

La syntaxe pour créer une vue est très simple:

« CREATE VIEW nomVue AS requête; » nomVue: Nom attribué à la vue.

Requête: requête permettant de récupérer les données de la vue.

Exemple:

CREATE VIEW CLIENT_P AS SELECT nom , adresse FROM CLIENT

WHERE LOCALITE = ‘Poitiers’;

22

« SELECT * FROM CLIENT_P; »

NOM ADRESSE HANSENNE 23 A. DUMONT TOTO 5 RUE GODEFROID

Les vues

Utilité des vues :

-

Permet de simplifier l’écriture des requêtes

-

Permet de mémoriser les requêtes réutilisables

-

Permet de masquer certaines informations.

On peut par exemple donner les droits d’utiliser une vue mais interdire d’utiliser la table. Dans notre exemple, les utilisateurs ne pourront pas accéder aux soldes des comptes des clients.

23

Les vues

Les vues peuvent être utilisées comme des tables dans des requêtes.

On les appelle aussi des tables logiques.

Exemple:

SELECT nomclient FROM CLIENT_P WHERE compte > 8000;

SELECT * FROM CLIENT WHERE numclient NOT IN

(SELECT numclient FROM CLIENT_P);

24

(5)

Les vues

Insertion à l’aide d’une vue :

L’insertion à l’aide d’une vue est seulement possible avec certains SGBD et pour les vues simples (pour lesquelles il n’y a pas d’ambigüité).

-

Exemple d’insertion qui peut fonctionner:

CREATE VIEW employe10 AS SELECT * FROM EMPLOYE WHERE numservemploye = 10;

INSERT INTO employe10

VALUES (25383, 'Dupont', 'Chef','1998-09-01', 12000,NULL,10,NULL);

-

Exemple de vue avec insertion impossible:

CREATE VIEW nbemployeparservice AS

SELECT numservemploye , count(*) FROM EMPLOYE GROUP BY numservemploye;

25

Les opérateurs ensemblistes

Les opérateurs ensemblistes travaillent sur des ensembles ! On peut considérer le résultat d’une requête comme un ensemble de données Attention: Les ensembles sur lesquels on travaille doivent être cohérents entre eux.

Exemple: UNION (ou UNION ALL pour conserver les doublons) SELECT nomEmploye from EMPLOYE WHERE nomEmploye LIKE ‘%A%’

UNION

SELECT nomEmploye from EMPLOYE WHERE nomEmploye LIKE ‘%B%’ ;

1) Affichez les noms d’employés et leur supérieur mais affichez aussi ceux qui n’encadrent personne ainsi que ceux qui n’ont pas de supérieur

Select e.nomEmploye , s.nomEmploye AS chef from EMPLOYE e LEFT OUTER JOIN EMPLOYE s

ON e.matSuperieur = s.mat UNION

Select e.nomEmploye , s.nomEmploye AS chef from EMPLOYE e RIGHT OUTER JOIN EMPLOYE s

ON e.matSuperieur = s.mat;

Remarque: Le FULL OUTER JOIN n’étant pas implémenté dans MySQL, l’utilisation de UNION permet de remédier à ce manque.

26

Les opérateurs ensemblistes

Autres opérateurs ensemblistes pouvant être utilisés:

-UNION: Réunion de 2 ensembles

-INTERSECT: Intersection de 2 ensembles (on retient les éléments communs) -MINUS ou EXCEPT (Dépend du SGBD): Différence (On retient les éléments du premier ensemble qui ne sont pas dans le second).

27

La division SQL

La division SQL a pour but de répondre à une question du type:

« Lister les modèles qui disposent de toutes les options » 2 solutions possibles:

a) Compter le nombre d’options par modèle et comparer au nombre d’options total

b) Lister les modèles pour lesquels il n’existe pas une seule option qui ne soit pas proposée pour ce modèle

28

La division SQL

La division SQL a pour but de répondre à une question du type:

« Lister les modèles qui disposent de toutes les options » 2 solutions possibles:

a) Compter le nombre d’options par modèle et comparer au nombre d’options total b) Lister les modèles pour lesquels il n’existe pas une seule option qui ne soit pas proposée

pour ce modèle Solution a:

select m.id_modele , libelle_modele from modele m , prix_option p where m.id_modele = p.id_modele group by m.id_modele

having count(*) = (select count(*) from options);

Solution b:

select m.id_modele , libelle_modele from modele m

where not exists (select * from options o

where not exists

(select * from prix_option p where p.id_modele = m.id_modele and o.id_option = p.id_option));

Les triggers

Définition:

Un trigger (ou déclencheur) est une procédure compilée, cataloguée dans le dictionnaire qui s’exécute automatiquement chaque fois que l’élément déclencheur associé se produit.

Un trigger est attaché à une table de la base de données et reconnaît des événements liés à:

• L’insertion d’enregistrements

• La mise à jour des données

• La suppression de tuples On utilise les déclencheurs pour :

• Assurer le respect de contraintes référentielles

• Assurer des contraintes d’inclusion (s’assurer que des valeurs insérées sont présentes dans d’autres tables)

• Abandonner des transactions

• Automatiser certaines actions (opérations en chaînes)

Les contraintes standards gérées par les SGBD sont prioritaires par rapport aux triggers !

Remarque: La syntaxe des triggers dépend du SGBD

(6)

Les triggers

Syntaxe:

Déclencheur sur instruction LMD (Langage de manipulation de données) : CREATE [OR REPLACE]TRIGGER trigger_name

timing

event1 [OR event2 OR event3]

ON table_name trigger_body

Trigger_name: Nom du déclencheur Timing: BEFORE ou AFTER

Event: INSERT ou DELETE ou UPDATE ou UPDATE OF column Table_name: Table ou vue associée au déclencheur

Trigger_body : Action effectuée par le déclencheur. Commence par DECLARE ou BEGIN et se termine par END ou appelle une procédure.

31

Les triggers

Syntaxe:

Déclencheur sur instruction LMD (Langage de manipulation de données) : CREATE [OR REPLACE]TRIGGER trigger_name

timing

event1 [OR event2 OR event3]

ON table_name trigger_body

Exemple avec le SGBD « Oracle »:

CREATE TRIGGER secure_dept BEFORE DELETE ON dept BEGIN

Raise_application_error(-20001, ‘La suppression d un département est interdite’);

END ;

Avec le SGBD « MySql »:

Les triggers sur instruction LMD n’ont pas été implémentés

32

Les triggers

Syntaxe:

Déclencheur sur une ligne LMD :

CREATE [OR REPLACE]TRIGGER trigger_name timing

event1 [OR event2 OR event3]

ON table_name

[REFERENCING OLD AS old / NEW AS new]

FOR EACH ROW [WHEN (condition)]

trigger_body

Trigger_name: Nom du déclencheur Timing: BEFORE ou AFTER

Event: INSERT ou DELETE ou UPDATE ou UPDATE OF column Table_name: Table ou vue associée au déclencheur

Referencing : Indique les noms des anciennes et nouvelles valeurs de la table For each row : Indique que le déclencheur est un déclencheur sur ligne.

When : Indique la condition de restriction d’exécution du déclencheur Trigger_body : Action effectuée par le déclencheur. Commence par DECLARE ou BEGIN et se termine par END ou appelle une procédure.

Déclencheur sur instruction LMD (Langage de manipulation de données) :

33

Les triggers

Exemple avec le SGBD « Oracle »:

Déclencheur sur une ligne LMD :

CREATE OR REPLACE TRIGGER maj_commission BEFORE INSERT OR UPDATE OF sal ON emp FOR EACH ROW

WHEN (NEW.job = ‘SALESMAN’) BEGIN

IF INSERTING THEN :NEW.comm := 0;

ELSIF :OLD.comm IS NULL THEN :NEW.comm := 0;

ELSE :NEW.comm := :OLD.comm * 1.05;

END IF;

END ;

34

Les triggers

Exemple avec le SGBD « MySql »:

Déclencheur sur une ligne LMD : DELIMITER //

CREATE TRIGGER maj_commission_Insert BEFORE INSERT ON emp

FOR EACH ROW BEGIN

SET NEW.comm= 0;

END ; //

CREATE TRIGGER maj_commission_Update BEFORE UPDATE ON emp

FOR EACH ROW BEGIN

IF NEW.sal != OLD.sal THEN SET NEW.comm = OLD.comm*1.05;

END IF;

END;

//

DELIMITER ;

35

Les triggers

Remarques:

Les triggers peuvent s’imbriquer: Un trigger qui déclenche un ordre SQL peut faire appel à d’autres triggers.

Nous avons vu quelques exemples simples mais les triggers peuvent exécuter des actions complexes, notamment en utilisant les structures répétitives.

36

(7)

Les triggers

Exercice:

Contrainte: Une moto ne peut pas être équipée d’options qui ne sont pas proposées pour son modèle de moto.

37

Comment exprimer la contrainte ci-dessus ?

Les triggers

Solution de l’exercice avec

« Oracle »:

Contrainte: Une moto ne peut pas être équipée d’options qui ne sont pas proposées pour son modèle de moto.

38 CREATE OR REPLACE TRIGGER valide_options

BEFORE INSERT OR UPDATE OF id_option ON options_possedees FOR EACH ROW

DECLARE v_nb NUMBER(5);

v_modele NUMBER(5);

BEGIN

SELECT modele INTO v_modele FROM moto WHERE immatriculation = :NEW.immatriculation;

SELECT count(*) INTO v_nb FROM prix_option WHERE id_option = :NEW.id_option AND id_modele = v_modele;

IF (v_nb = 0)

THEN Raise_application_error(-20008, 'Option non autorisee pour ce modele');

END IF ; END ;

Les triggers

Solution impossible à mettre en œuvre dans MySql

La syntaxe qui serait ou sera à implémenter dans MySql sera la suivante:

39 CREATE TRIGGER valide_options

BEFORE INSERT ON optionspossedees FOR EACH ROW

BEGIN

DECLARE v_nb INT;

DECLARE v_modele INT;

DECLARE invalide CONDITION FOR -1001;

DECLARE EXIT HANDLER FOR invalide SET @error = 'Option interdite';

SELECT modele INTO v_modele FROM moto WHERE immatriculation = NEW.moto;

SELECT count(*) INTO v_nb FROM prix_option WHERE id_option = NEW.id_option AND modele = v_modele;

IF (v_nb = 0) THEN SIGNAL invalide;

END IF;

END ;

Références

Documents relatifs

Ecrire une fonction « nouveau_commentaire() » qui pose les différentes questions sur les données à saisir et exécute la fonction précédente avec les valeurs saisies4. Exécuter

Construction de nouveaux élements et documents SGML Exemple : extraire toutes les entrées bibliographiques de $mybook et fabriquer un nouveau document de type BIBLIO contenant la

Dans cet article nous présentons un nouveau langage d’analyse OLAP destiné aux décideurs ; il permet d’exprimer des requêtes complexes sur un entrepôt de documents XML

I exporter et importer une base de données grâce à des scripts I créer des vues pour stocker le résultat de vos requêtes.. 4

– si un même type d’entité intervient plusieurs fois dans un même type d’association, on doit explicitement indiquer le rôle de chaque entité – si on a

NumEtud Nom Prenom Adresse DateNais Sexe NumCours NomCours NomProf NbHC NbHTD NbHTP NumEtud NumCours Note. E1

Traitements pour la classification de textes Les données textuelles sont difficiles à gérer :.. 1 Les corpus sont volumineux, le vocabulaire est grand : - il faut des

La ligne de code suivante trie les données du fichier nat2018.csv selon le nombre de fois que le prénom a été donné selon l'ordre croissant. In