Objectifs Prsentation du langage SQL et de lalgbre relationnel Interrogation et mise jour dune base de donnes en SQL interactif Construction complte dune base de donnes Notions dadministration dune base de donnes en Client/Serveur Prsentation du modle client/serveur
ISTA.ma Un portail au service de la formation professionnelle
Le Portail http://www.ista.ma Que vous soyez tudiants, stagiaires, professionnels de simplement intress(e) par les questions relatives aux formations http://www.ista.ma vous propose un contenu mis jour en permanence et richement quotidien de lactualit, et une varit de ressources documentaires, de supports de formation ,et de documents en ligne ( supports de cours, mmoires, exposs, rapports de stage
Le site propose aussi une multitude de conseils concerne la recherche d'un emploi ou d'un stage sa lettre de motivation, comment faire son CV, comment se prparer l'entretien dembauche Les forums http://forum.ista.ma ragir l'actualit, poser des question tout ceci et apporter votre pierre l'difice. Notre Concept Le portail http://www.ista.ma est bas sur un concept de gratuit intgrale du contenu & un modle collaboratif qui favorise la culture dchange et le sens du partage entre les Notre Mission Diffusion du savoir & capitalisation des expriences. Notre Devise Partageons notre savoir Notre Ambition Devenir la plate-forme leader dans le domaine de la Notre Dfi Convaincre de plus en plus de personnes pour rejoindre notre communaut et accepter de partager leur savoir avec les autres membres. Web Project Manager - Badr FERRASSI : http://www.ferrassi.com
- contactez : au service de la formation professionnelle
ue vous soyez tudiants, stagiaires, professionnels de terrain, formateurs, ou que vous soyez tout simplement intress(e) par les questions relatives aux formations professionnelle propose un contenu mis jour en permanence et richement quotidien de lactualit, et une varit de ressources documentaires, de supports de formation ,et de supports de cours, mmoires, exposs, rapports de stage une multitude de conseils et des renseignements trs utiles sur tout ce qui emploi ou d'un stage : offres demploi, offres de stage sa lettre de motivation, comment faire son CV, comment se prparer l'entretien dembauche http://forum.ista.ma sont mis votre disposition, pour faire part de vos expriences, questionnements, susciter des rponses.N'hsitez pas interagir avec r votre pierre l'difice. est bas sur un concept de gratuit intgrale du contenu & un modle collaboratif qui favorise la culture dchange et le sens du partage entre les membres de la communaut ista. Diffusion du savoir & capitalisation des expriences. dans le domaine de la Formation Professionnelle. lus en plus de personnes pour rejoindre notre communaut et accepter de partager leur http://www.ferrassi.com terrain, formateurs, ou que vous soyez tout professionnelle, aux mtiers, propose un contenu mis jour en permanence et richement illustr avec un suivi quotidien de lactualit, et une varit de ressources documentaires, de supports de formation ,et de supports de cours, mmoires, exposs, rapports de stage ) . et des renseignements trs utiles sur tout ce qui offres demploi, offres de stage, comment rdiger sa lettre de motivation, comment faire son CV, comment se prparer l'entretien dembauche, etc. faire part de vos expriences, 'hsitez pas interagir avec est bas sur un concept de gratuit intgrale du contenu & un modle membres de la communaut ista. lus en plus de personnes pour rejoindre notre communaut et accepter de partager leur Base de donnes : SQL page 2
La connexion ODBC et lutilisation dACCESS comme client
Mode demploi
Pour chacun des thmes abords, ce support de formation :
- prsente les points essentiels
- renvoie des supports de cours, des livres ou la documentation en ligne constructeur, par le symbole :
- propose des exercices pratiques par le symbole :
Autres symboles utiliss :
Point important qui mrite dtre soulign
e A viter tout prix !
Manip raliser avec un utilitaire graphique (qui devrait normalement simplifier le travail !)
Approfondissement : travail de documentation ou exercice supplmentaire, faire individuellement (non intgr dans le temps de formation moyen) Base de donnes : SQL page 3
1. PRESENTATION DU LANGAGE SQL 1.1 Ressources
Pour la syntaxe du langage SQL : consulter le livre SQL2 Initiation/Programmation de Christian Mare et Guy Ledant
Pour lutilisation de lenvironnement SQL Server : utiliser Documentation en ligne de SQL Server et Aide de Transact SQL sous Analyseur de requte SQL
1.2 Historique du langage S.Q.L. (Structured Query Language) est un langage structur permettant dinterroger et de modifier les donnes contenues dans une base de donnes relationnelle. Il est issu de SEQUEL : Structured English Query Language. Cest le premier langage pour les S.G.B.D Relationnels. Il a t dvelopp par IBM en 1970 pour systme R, son 1 er SGBDR. S.Q.L. a t reconnu par lANSI puis impos comme norme. Il nexiste pas de S.G.B.D.R sans S.Q.L. ! Malheureusement, malgr la norme SQL, il existe un ensemble de dialectes qui respectent un minimum commun. Ce cours sappuiera sur le langage Transact SQL de Microsoft, en essayant de rester le plus standard possible.
1.3 Notion de relation
SQL 2 : Partie I Approche p. 1 25
SQL est bas sur la thorie des ensembles : il manipule des tables qui reprsentent le graphe dune relation entre plusieurs ensembles (colonnes). Chaque ligne ou tuple est un lment du graphe de la relation IdPilote NomPilote PrenomPilote 1 GAINSBOURG Serge 2 FERRAT Jean 3 NOUGARO Claude 4 SCHUMMAN Robert 5 STROGOFF Michel 6 SORREL Lucien 7 TAVERNIER Bertrand 8 FAYOLLE Marc 9 LECU Rgis
Colonne ou attribut Ligne ou tuple Base de donnes : SQL page 4
Exemple : la base de donnes Compagnie arienne que lon crera sous SQL Server dans la suite de ce cours : Schma gnral de la base
Structure et contenu des tables
AVION ( NumAvion, TypeAvion, BaseAeroport)
NumAvion : numro davion (cl primaire, numrique)
TypeAvion : type davion : A320, B707 (Cl trangre vers la colonne TypeAvion de la table TYPE, alphanumrique)
BaseAeroport : identificateur de laroport o est bas lavion (cl trangre vers la colonne IdAeroport de la table AEROPORT, 3 lettres)
Lien vers cl primaire Base de donnes : SQL page 5
NumAvion TypeAvion BaseAeroport 100 A320 NIC 101 B707 CDG 102 A320 BLA 103 DC10 BLA 104 B747 ORL 105 A320 GRE 106 ATR42 CDG 107 B727 LYS 108 B727 NAN 109 A340 BAS
Tous les avions de mme type ont des caractristiques communes : tous les A320 possdent le mme nombre de places et sont contruits par AirBus . Pour ne pas introduire de redondance dans notre base, il faut donc crer une table TYPE pour stocker le nombre de places et le nom du constructeur.
TYPE ( TypeAvion, Capacite, IdConstructeur)
TypeAvion : type davion (cl primaire, alphanumrique)
Capacit : nombre de places (numrique)
IdConstructeur : identificateur du constructeur (cl trangre vers la colonne IdConstructeur de la table CONSTRUCTEUR, numrique)
Les noms des constructeurs doivent tre connus avant de renseigner les types davion : il faut les stocker dans une table indpendante CONSTRUCTEUR , pour pouvoir les prsenter lutilisateur dans une liste droulante. Par ailleurs, cette solution conomise de la place dans la base de donnes (N entiers au lieu de N fois 50 caractres)
CONSTRUCTEUR ( IdConstructeur, NomConstructeur)
IdConstructeur : identificateur du constructeur (cl primaire, numrique)
NomConstructeur : nom du constructeur (alphanumrique)
IdConstructeur NomConstructeur 1 Arospatiale 2 Boeing 3 Cessna 4 Douglas Base de donnes : SQL page 6
Tous les avions sont bass dans un aroport. Les vols effectus par la compagnie arienne vont dun aroport de dpart un aroport darrive. La table AEROPORT doit regrouper toutes les caractristiques qui concernent directement laroport : identificateur, nom, ville desservie
IdAeroport : identificateur de laroport (cl primaire, 3 lettres)
NomAeroport : nom de laroport (alphanumrique)
NomVilleDesservie : ville desservie par laroport (alphanumrique)
IdAeroport NomAeroport NomVilleDesservie BAS Poretta Bastia BLA Blagnac Toulouse BRI Brive Brive CDG Roissy Paris GRE Saint Geoir Grenoble LYS Saint exupry Lyon NAN Saint Herblain Nantes NIC Nice cote d'azur Nice ORL Orly Paris
Un vol, dcrit par un numro de vol unique, relie un aroport de dpart un aroport darrive, en partant une heure donne et en arrivant une heure donne.
Le mme vol est propos par la compagnie arienne des dates diffrentes, avec des moyens (pilote et avion) ventuellement diffrents : ne pas confondre la table VOL qui dcrit les caractristiques gnrales du vol, avec la table AFFECTATION qui dcrit les moyens mis en uvre pour un VOL propos une date donne.
AeroportDept : identificateur de laroport de dpart (cl trangre vers la colonne IdAeroport de la table AEROPORT, 3 lettres) Hdpart : heure de dpart (type heure) AeroportArr : identificateur de laroport darrive (cl trangre vers la colonne IdAeroport de la table AEROPORT, 3 lettres) Harrive : heure darrive (type heure) NumVol AeroportDept Hdpart AeroportArr HArrive IT100 NIC 7:00 CDG 9:00 IT101 ORL 11:00 BLA 12:00 IT102 CDG 12:00 NIC 14:00 IT103 GRE 9:00 BLA 11:00 IT104 BLA 17:00 GRE 19:00 IT105 LYS 6:00 ORL 7:00 IT106 BAS 10:00 ORL 13:00 IT107 NIC 7:00 BRI 8:00 IT108 BRI 19:00 ORL 20:00 IT109 NIC 18:00 ORL 19:00 Base de donnes : SQL page 7
IT110 ORL 15:00 NIC 16:00 IT111 NIC 17:00 NAN 19:00
Pour connatre une desserte de faon unique, il faut connatre le numro de vol et la date : la table AFFECTATION aura donc une cl primaire compose , constitue par la concatnation des colonnes NumVol et DateVol.
AFFECTATION (NumVol, DateVol, NumAvion, IdPilote)
NumVol : numro de vol (cl trangre vers la colonne NumVol de la table VOL)
DateVol : date du vol (type date). Cl primaire : NumVol + DateVol
NumAvion : numro de lavion qui assure le vol (cl trangre vers la colonne NumAvion de la table Avion, numrique)
IdPilote : identificateur du pilote en charge du vol (cl trangre vers la colonne IdPilote de la table Pilote, numrique) NumVol DateVol NumAvion IdPilote IT100 6 avril 2001 100 1 IT100 7 avril 2001 101 2 IT101 6 avril 2001 100 2 IT101 7 avril 2001 103 4 IT102 6 avril 2001 101 1 IT102 7 avril 2001 102 3 IT103 6 avril 2001 105 3 IT103 7 avril 2001 104 2 IT104 6 avril 2001 105 3 IT104 7 avril 2001 107 8 IT105 6 avril 2001 107 7 IT105 7 avril 2001 106 7 IT106 6 avril 2001 109 8 IT106 7 avril 2001 104 5 IT107 6 avril 2001 106 9 IT107 7 avril 2001 103 8 IT108 6 avril 2001 106 9 IT108 7 avril 2001 106 5 IT109 6 avril 2001 107 7 IT109 7 avril 2001 105 1 IT110 6 avril 2001 102 2 IT110 7 avril 2001 104 3 IT111 6 avril 2001 101 4 IT111 7 avril 2001 100 8
Les lments dune colonne appartiennent tous au mme ensemble appel domaine Une cl qui fait rfrence la cl primaire dune autre table est appele cl trangre : NumAvion dans Affectation
Base de donnes : SQL page 8
1.4 Rappels dalgbre relationnel
Toutes les requtes SQL correspondent une combinaison des 7 oprateurs dalgbre relationnel.
Les Oprateurs Ensemblistes
Ne sappliquent qu des relations unicompatibles : possdant le mme nombre dattributs sur les mmes domaines : l'union permet le regroupement de tuples :
R1 Vols destination de Paris charles de Gaulle
NumVol AeroportDept Hdpart AeroportArr HArrive IT100 NIC 7:00 CDG 9:00
NumVol AeroportDept Hdpart AeroportArr HArrive IT100 NIC 7:00 CDG 9:00 IT105 LYS 6:00 ORL 7:00 IT106 BAS 10:00 ORL 13:00 IT108 BRI 19:00 ORL 20:00 IT109 NIC 18:00 ORL 19:00
l'intersection permet la cration d'une table partir de tuples communs 2 tables :
R4 Vols Dpart Nice
NumVol AeroportDept Hdpart AeroportArr HArrive IT100 NIC 7:00 CDG 9:00 IT107 NIC 7:00 BRI 8:00 IT109 NIC 18:00 ORL 19:00 IT111 NIC 17:00 NAN 19:00
R5 Vols Arrive Paris Orly
NumVol AeroportDept Hdpart AeroportArr HArrive IT105 LYS 6:00 ORL 7:00 IT106 BAS 10:00 ORL 13:00 Base de donnes : SQL page 9
IT108 BRI 19:00 ORL 20:00 IT109 NIC 18:00 ORL 19:00
R6 = R4 ^ R5 Vols dpart Nice, arrive Orly
NumVol AeroportDept Hdpart AeroportArr HArrive IT109 NIC 18:00 ORL 19:00
la diffrence slectionne les tuples d'une table en liminant les tuples prsents dans une autre table.
R7 = R4 -R3 Vols dpart Nice, arrive Province
NumVol AeroportDept Hdpart AeroportArr HArrive IT107 NIC 7:00 BRI 8:00 IT111 NIC 17:00 NAN 19:00
Oprateurs Relationnels Unaires
la slection ralise un dcoupage horizontal de la table en ne conservant que les tuples satisfaisant une condition dfinie sur les valeurs d'un attribut. = Certains enregistrements et tous les attributs.
Exemples : Descriptif complet des vols pour Nice : toutes les lignes de la table VOL telles que AeroportArr = 'NIC'.
Descriptif complet des avions de type A320 : toutes les lignes de la table AVION telles que TypeAvion = 'A320'
la projection permet de ne conserver que les attributs (colonnes) intressants ; c'est un dcoupage vertical de la table. = Certains attributs et tous les enregistrements.
Exemples : liste de tous les numros davions Base de donnes : SQL page 10
liste des noms et des prnoms des pilotes
Oprateurs Relationnels Binaires
le produit cartsien ralise la juxtaposition ou concatnation de tous les tuples d'une table avec tous les tuples d'une autre table. Si les 2 tables ont M et N tuples le rsultat aura M * N tuples. A1 B1 A1 B1 A2 B2 A2 B1 A3 A3 B1 A1 B2 A2 B2 A3 B2
Le jointure (join), est possible seulement sur 2 tables possdant un domaine commun. La jointure consiste juxtaposer les tuples dont la valeur dun attribut est identique dans les deux tables. On constate que souvent, la jointure porte sur des cls trangre et primaire lies.
Exemple : Faire un Planning des Vols indiquant le nom et le prnom des Pilotes
Il faut concatner les lignes de la table Affectation avec celles de la table Pilote, pour lesquelles Affectation.IdPilote = Pilote.IdPilote
Table Affectation NumVol DateVol NumAvion IdPilote IT100 6 avril 2001 100 1 IT100 7 avril 2001 101 2 IT101 6 avril 2001 100 2 IT101 7 avril 2001 103 4 IT102 6 avril 2001 101 1 IT102 7 avril 2001 102 3 IT103 6 avril 2001 105 3 IT103 7 avril 2001 104 2 IT104 6 avril 2001 105 3 IT104 7 avril 2001 107 8 IT105 6 avril 2001 107 7 IT105 7 avril 2001 106 7 IT106 6 avril 2001 109 8 IT106 7 avril 2001 104 5 IT107 6 avril 2001 106 9 IT107 7 avril 2001 103 8 IT108 6 avril 2001 106 9 IT108 7 avril 2001 106 5 IT109 6 avril 2001 107 7 IT109 7 avril 2001 105 1 Base de donnes : SQL page 11
IT110 6 avril 2001 102 2 IT110 7 avril 2001 104 3 IT111 6 avril 2001 101 4 IT111 7 avril 2001 100 8
Table Pilote IdPilote NomPilote PrenomPilote 1 GAINSBOURG Serge 2 FERRAT Jean 3 NOUGARO Claude 4 SCHUMMAN Robert 5 STROGOFF Michel 6 SORREL Lucien 7 TAVERNIER Bertrand 8 FAYOLLE Marc 9 LECU Rgis
Planning : jointure Affectation - Pilotes
NumVol DateVol NumAvion NomPilote PrenomPilote IT100 6 avril 2001 100 GAINSBOURG Serge IT100 7 avril 2001 101 FERRAT Jean IT101 6 avril 2001 100 FERRAT Jean IT101 7 avril 2001 103 SCHUMMAN Robert IT102 6 avril 2001 101 GAINSBOURG Serge IT102 7 avril 2001 102 NOUGARO Claude IT103 6 avril 2001 105 NOUGARO Claude IT103 7 avril 2001 104 FERRAT Jean IT104 6 avril 2001 105 NOUGARO Claude IT104 7 avril 2001 107 FAYOLLE Marc IT105 6 avril 2001 107 TAVERNIER Bertrand IT105 7 avril 2001 106 TAVERNIER Bertrand IT106 6 avril 2001 109 FAYOLLE Marc IT106 7 avril 2001 104 STROGOFF Michel IT107 6 avril 2001 106 LECU Rgis IT107 7 avril 2001 103 FAYOLLE Marc IT108 6 avril 2001 106 LECU Rgis IT108 7 avril 2001 106 STROGOFF Michel IT109 6 avril 2001 107 TAVERNIER Bertrand IT109 7 avril 2001 105 GAINSBOURG Serge IT110 6 avril 2001 102 FERRAT Jean IT110 7 avril 2001 104 NOUGARO Claude IT111 6 avril 2001 101 SCHUMMAN Robert IT111 7 avril 2001 100 FAYOLLE Marc Base de donnes : SQL page 12
1.5 Place de SQL dans les SGBDR
La plupart des SGBDR du march (DB2-IBM, ORACLE, INFORMIX, SYBASE...) offrent plus qu'un langage de requte puissant (en gnral SQL). On y trouve toute une panoplie d'outils dits de 4me gnration :
gnrateur d'crans : facilitant la saisie et l'affichage de donnes par imbrication de requtes,
gnrateur d'tats : pour la sortie d'tat de la BD sur papier ou cran,
gnrateur d'application : qui fait appel aux crans et tats prcdents, et qui permet la cration de menus ainsi que des traitements sur la BD par requtes simples (en SQL) ou en imbriquant des appels des programmes dvelopps en L3G (ce qui permet de combiner puissance des outils de 4me gnration et souplesse des L3G).
gnrateur de schma conceptuel : pour la description de la structure des donnes (entits, attributs, liens...). A tous les niveaux, le langage SQL normalis par l'ANSI est reconnu comme le langage de requte par excellence qui permet la cration, la manipulation et le contrle des donnes ; il constitue le lien entre les divers composants du SGBDR comme le montre le schma suivant :
GENERATEUR DE RAPPORTS GENERATEUR GENERATEUR GENERATEUR D'ECRANS D'APPLICATI0NS DE SCHEMAS CONCEPTUELS ACCES RESEAUX + UTILITAIRES SQL DICTIONNAIRE NOYAU
Base de donnes : SQL page 13
2. DECOUVERTE PRATIQUE DU LANGAGE SQL 2.1 Connexion la base de donnes PUBLI
Outils disponibles dans le menu Microsoft SQL Server 7.0 : Analyseur de requte SQL (interprteur SQL interactif), Enterprise Manager (administration des bases de donnes en rseau)
Pour linitiation SQL, utilisez Analyseur de requte SQL
Choisissez Utilisez lauthentification SQL Server : - Nom de connexion : Stage - Mot de passe : stage
A la connexion, vous tes dans la base de donnes par dfaut master Pour accder la base de donnes de dmonstration publi,slectionnez la dans la liste droulante, ou utilisez l'instruction USE: USE PUBLI
Pour vrifier la connexion, faites une interrogation simple : Dans longlet Requte tapez : select * from magasins
Cliquez sur la flche verte pour lancer la requte, qui affiche la description des magasins : id_mag nom_mag adresse_mag ville pays code_postal ------ ---------------------------------------- ---------------------------------------- -------------------- ---- ----------- 6380 Eric the Read Books 788, Catamaugus Ave. Seattle WA 98056 7066 Librairie spcialise 567, Av. de la Victoire Paris FR 75016 7067 Moissons livresques 577, Boulevard Anspach. Bruxelles BE 1000 ..etc
2.2 Description de la base de donnes PUBLI
Il y a parfois des petites diffrences entre la documentation et le contenu rel des tables => pensez vrifier vos programmes en visualisant les contenus des tables par des requtes simples A partir de SQL Server 7.0, la base originale sur laquelle sappuient tous les exemples de la documentation Microsoft, est en anglais : PUBS. Vous pouvez lutiliser pour tester des syntaxes documentes dans laide, mais les exercices porteront toujours sur la version franaise de la base : PUBLI
Base de donnes : SQL page 14
Publi dcrit la base de donnes dun groupe ddition.
- Tous les diteurs appartenant au groupe sont dcrits dans la table diteurs. - Les diteurs ont des logo (table pub_info), emploient du personnel (table employ), et ditent des livres (table titre). - Chaque employ occupe un emploi (table emplois) - Chaque livre est crit par un ou plusieurs auteurs (table auteurs et table intermdiaire titreauteur) - Pour chaque livre vendu, son/ses auteurs touchent des droits, qui sont dfinis en pourcentage du prix de vente, par tranche, en fonction de la quantit de livres vendus (table droits_prvus). - Les livres sont vendus dans des magasins (table ventes et magasins) Base de donnes : SQL page 15
- Diffrents types de remise sont consentis sur les livres vendus (table remises)
Les commentaires de dtail seront donns table par table.
Table diteurs
Nom_colonne Type de donnes NULL Par dfaut Check Cl/index id_diteur char(4) non oui (1) CP, ordonn. nom_diteur varchar(40) oui ville varchar(20) oui rgion char(2) oui pays varchar(30) oui 'USA'
(1) La contrainte CHECK id_diteur est dfinie comme (id_diteur in ('1389', '0736', '0877', '1622', '1756') OR id_diteur LIKE '99[0-9][0-9]')
id_diteur nom_diteur ville rgion pays 0736 New Moon Books Boston MA USA 0877 Binnet & Hardley Washington DC USA 1389 Algodata Infosystems Bruxelles NULL BE 1622 Five Lakes Publishing Chicago IL USA 1756 Ramona diteur Lausanne NULL CH 9901 GGG&G Munich NULL GER 9952 Scootney Books New York NY USA 9999 Editions Lucerne Paris NULL FR
Table pub_info
Nom_colonne Type de donnes NULL Par dfaut Check Cl/index pub_id char(4) non CP, ordonn., CE diteurs(id_diteur) logo image oui pr_info text oui
id_diteur logo (1) info_rp (2)
0736 NEWMOON.BMP Exemple de donnes de type text pour New Moon Books, diteur 0736 dans la base de donnes pubs. New Moon Books est situ Boston, Massachusetts.
0877 BINNET.BMP Exemple de donnes de type text pour Binnet & Hardley, diteur 0877 dans la base de donnes pubs. Binnet & Hardley est situ Washington, D.C.
1389 ALGODATA.BMP Exemple de donnes de type text pour Algodata Infosystems, diteur 1389 dans la base de donnes pubs. Algodata Infosystems est situ Bruxelles, Belgique.
1622 5LAKES.BMP Exemple de donnes de type text pour Five Lakes Publishing, diteur 1622 dans la base de donnes pubs. Five Lakes Publishing est situ Chicago, Illinois.
1756 RAMONA.BMP Exemple de donnes de type text pour Ramona diteur, diteur 1756 dans la base de donnes pubs. Ramona diteur est situ Lausanne, Suisse.
9901 GGGG.BMP Exemple de donnes de type text pour GGG&G, diteur 9901 dans la base de donnes pubs. GGG&G est situ Munich, Allemagne.
9952 SCOOTNEY.BMP Exemple de donnes de type text pour Scootney Books, diteur 9952 dans la base de donnes pubs. Scootney Books est situ New York City, New York.
9999 LUCERNE.BMP Exemple de donnes de type text pour ditions Lucerne, diteur 9999 dans la base de donnes pubs. Les ditions Lucerne sont situes Paris, France.
(1) Les informations prsentes ici NE sont PAS les donnes relles. Il s'agit du nom du fichier d'o provient le bitmap (donnes graphiques). (2) Le texte prsent ici NE constitue PAS la totalit des donnes. Lors de l'affichage de donnes text, l'affichage est limit un nombre fini de caractres. Ces informations prsentent les 120 premiers caractres de la colonne de texte.
Base de donnes : SQL page 16
Table employ
Tous les employs ont un coefficient actuel (colonne position_employ), compris entre le coefficient minimum et le coefficient maximum correspondant leur type demploi (niv_min et niv_max dans la table emplois)
Nom_colonne Type de donnes NULL Par dfaut Check Cl/index id_employ empid non oui (1) CP, non ordonn. pn_employ varchar(20) non Compos, ordonn. (2) init_centrale char(1) oui Compos, ordonn. (2) nom_employ varchar(30) non Compos, ordonn. (2) id_emploi smallint non 1 CE emplois(id_emploi) position_employ tinyint non 10 id_diteur char(4) non '9952' CE diteurs(id_diteur) date_embauche datetime non GETDATE( )
(1) La contrainte CHECK est dfinie comme (id_employ LIKE '[A-Z][A-Z][A-Z][1-9][0-9][0-9][0-9][0-9][FM]') OR (id_employ LIKE '[A-Z]-[A-Z][1-9][0-9][0-9][0-9][0-9][FM]') (2) L'index compos, ordonn est dfini sur nom_employ, pn_employ, init_centrale.
Les tableaux suivants prsentent le contenu de la table employ. La premire colonne (id_employ) est rpte dans la liste du dessous, devant les colonnes 6 8. Elle n'est rpte qu' des fins de lisibilit.
PMA42628M Paolo M Accorti 13 PSA89086M Pedro S Alfonso 14 VPA30890F Victoria P Ashworth 6 PHB50241M Patrick H Brognon 9 L-B31947F Lesley NULL Brown 7 F-C16315M Francisco NULL Chang 4 PTC11962M Philip T Cramer 2 A-C71970F Aria NULL Cruz 10 PJD25939M Philippe J De Bueger 5 R-D39728F Renelde NULL Depr 8 AMD15433F Ann M Devon 3 ARD36773F Anabela R Domingues 8 PHF38899M Peter H Franken 10 PXH22250M Paul X Henriot 5 PDI47470M Palle D Ibsen 7 KFJ64308F Karin F Josephs 14 MGK44605M Matti G Karttunen 6 POK93028M Pirkko O Koskitalo 10 JYL26161F Janine Y Labrune 5 M-L67958F Maria NULL Larsson 7 Y-L77953M Yoshi NULL Latimer 12 LAL21447M Laurence A Lebihan 5 ENL44273F Elizabeth N Lincoln 14 PCM98509F Patricia C McKenna 11 R-M53550M Roland NULL Mendel 11 HAN90777M Helvetius A Nagy 7 TPO55093M Timothy P O'Rourke 13 SKO22412M Sven Ottlieb 5 MAP77183M Miguel A Paolino 11 PSP68661F Paula S Parente 8 M-P91209M Manuel NULL Pereira 8 LCQ23061M Luc C Querton 5 LJR92907F Laurence J Radoux 9 M-R38834F Martine Ranc 9 DWR65030M Diego W Roel 6 A-R89858F Annette NULL Roulet 6 CAS28514M Carlos A Santana 5 MMS49649F Mary M Saveley 8 CGS88322F Carine G Schmitt 13 MAS70474F Margaret A Smith 9 HAS54740M Howard A Snyder 12 MFS52347M Martn F Sommer 10 DBT39435M Daniel B Tonini 11
A chaque type demploi, correspond un coefficient minimal (niv_min) et un coefficient maximal (niv_max)
Nom_colonne Type de donnes NULL Par dfaut Check Cl/index id_emploi smallint non IDENTITY(1,1) CP, ordonn. desc_emploi varchar(50) non oui (1) niv_min tinyint non oui (2) niv_max tinyint non oui (3)
id_emploi desc_emploi niv_min niv_max
1 Nouveau collaborateur Poste non spcifi 10 10 2 Directeur gnral 200 250 3 Directeur des oprations commerciales 175 225 4 Responsable financier 175 250 5 Editeur 150 250 6 Editeur en chef 140 225 7 Directeur du marketing 120 200 8 Directeur des relations publiques 100 175 9 Directeur des achats 75 175 10 Directeur de la productionr 75 165 11 Directeur des oprations 75 150 12 Rdacteur 25 100 13 Reprsentant commercial 25 100 14 Graphiste 25 100
(1) La contrainte DEFAULT est dfinie comme ("Nouveau poste - pas de dnomination officielle"). (2) La contrainte CHECK niv_min est dfinie comme (niv_min >= 10). (3) La contrainte CHECK niv_max est dfinie comme (niv_max <= 250).
Base de donnes : SQL page 18
Table auteurs Certains auteurs travaillent sous contrat avec leur diteur ( colonne contrat de type bit)
Nom_colonne Type de donnes NULL Par dfaut Check Cl/Index id_auteur id non oui (1) CP, . nom_auteur varchar(40) non Compos, non ordonn (3) pn_auteur varchar(20) non Compos, non ordonn (3) tlphone char(12) non 'INCONNU' adresse varchar(40) oui ville varchar(20) oui pays char(2) oui code_postal char(5) oui oui (2) contrat bit non
(1) La contrainte CHECK id_auteur est dfinie comme (id_auteur LIKE '[0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]'). (2) La contrainte CHECK code_postal est dfinie comme (code_postal LIKE '[0-9][0-9][0-9][0-9][0-9]'). (3) L'index compos non ordonn est dfini sur nom_auteur, pn_auteur.
Les tables ci-dessous prsentent le contenu de la table auteurs. La premire colonne (id_auteur) est rpte dans la liste du dessous, devant les colonnes 5 9. Elle n'est rpte qu' des fins de lisibilit.
172-32-1176 4, square Gauguin Nice FR 06014 1 213-46-8915 18, avenue Arbabi Paris FR 75017 1 238-95-7766 4, impasse Lamoix Bordeaux FR 33000 1 267-41-2394 48, passage Sainte Anne Toulouse FR 31002 1 274-80-9391 2, place du Gnral Catroux Paris FR 75015 1 341-22-1782 14, impasse Lacarte Lige BE 01548 0 409-56-7008 201, boulevard de Clichy Bordeaux FR 33000 1 427-17-2319 32, rue de l'Amiral Clou Luxembourg LU 01016 1 472-27-2349 11, rue Buffon Bruxelles BE 02530 1 486-29-1786 62-64, rue Vieille du Temple Chevrette FR 91450 1 527-72-3246 57, avenue des tapis Zurich CH 91450 0 648-92-1872 55 , rue Pierre-Louis Coll Zurich CH 91450 1 672-71-3249 113, rue du Cherche-Midi Vers-La-Petite FR 91712 1 712-45-1867 18, faubourg Saint Jean Monte Carlo MC 98000 1 722-51-5454 12, rue Astarte Luxembourg LU 02016 1 724-08-9931 75, rue des Couronnes Paris FR 75017 0 724-80-9391 20, rue de la Pompe Marseille FR 13016 1 756-30-7391 94, rue de la Condamine Paris FR 75020 1 807-91-6654 4, chemin de la Tour de Campel Bruges BE 05006 1 846-92-7186 32, rue du Mont Thabor Lille FR 59000 1 893-72-1158 59, rue Lisleferme Paris FR 75018 0 899-46-2035 48, rue de Valmy Genve CH 91712 1 998-72-3567 48, rue de Valmy Genve CH 91712 1
Base de donnes : SQL page 19
Table titreauteur Attention : certains auteurs peuvent tre dcrits dans la table Auteurs sans tre prsents dans la table titreauteur, sils nont encore rien crit (cas des auteurs sous contrat qui crivent leur premier livre)
Nom_colonne Type de donnes NULL Par dfaut Check Cl/index id_auteur id non Compos CP, ordonn., (1) CE auteurs(id_auteur) (2) id_titre tid non Compos CP, ordonn., (1) CE titres(id_titre) (3) cmd_auteur tinyint oui droits_pourcent int oui
(1) L'index compos, cl primaire, ordonn est dfini sur id_auteur, id_titre. (2) Cette cl trangre a galement un index non ordonn sur id_auteur. (3) Cette cl trangre a galement un index non ordonn sur id_titre.
Certains auteurs peroivent une avance sur recette, pendant lcriture de leur livre ( colonne avance). Pour chaque titre, on tient jour le nombre douvrages vendus, tous magasins confondus (colonne cumulannuel_ventes), et la tranche de droit dauteur atteinte par ce livre (colonne droits)
Nom_colonne Type de donnes NULL Par dfaut Check Cl/index id_titre tid non CP, ordonn. titre varchar(80) non Non ordonn. type char(12) non UNDECIDED' id_diteur char(4) oui CE diteurs(id_diteur) prix money oui avance money oui droits int oui cumulannuel_ventes int oui notes varchar(200) oui datepub datetime non GETDATE( )
Les tableaux ci-aprs prsentent le contenu de la table titres. La premire colonne (id_titre) est rpte dans les listes du dessous, d'abord devant les colonnes 5 8, ensuite devant les colonnes 9 et 10. Elle n'est rpte qu' des fins de lisibilit.
id_titre (#1) titre (#2) t type (#3) id_diteur (#4) prix (#5) BU1032 Guide des bases de donnes du gestionnaire press gestion 1389 140,00 BU1111 La cuisine - l'ordinateur : bilans clandestins gestion 1389 82,00 BU2075 Le stress en informatique n'est pas une fatalit! gestion 0736 24,00 BU7832 Toute la vrit sur les ordinateurs gestion 1389 136,00 MC2222 Les festins de Parly 2 cui_moderne 0877 136,00 MC3021 Les micro-ondes par gourmandise cui_moderne 0877 21,00 MC3026 La psychologie des ordinateurs de cuisine SANS TITRE 0877 NULL PC1035 Est-ce vraiment convivial? informatique 1389 156,00 PC8888 Les secrets de la Silicon Valley informatique 1389 136,00 PC9999 Guide des bonnes manires sur un rseau informatique 1389 NULL PS1372 Phobie et passion informatique : ventail de comportements psychologie 0877 147,00 PS2091 La colre : notre ennemie? psychologie 0736 76,00 PS2106 Vivre sans crainte psychologie 0736 49,00 Base de donnes : SQL page 20
PS3333 Privation durable d'informations : tude de quatre cas reprsentatifs psychologie 0736 136,00 PS7777 Equilibre motionnel : un nouvel algorithme psychologie 0736 54,00
id_titre (#1) notes (#9) datepub (#10) BU1032 Vue d'ensemble illustre des systmes de gestion de base de donnes disponibles sur le march. L'accent est mis sur les applications de gestion courantes. 06/12/85
BU1111 Conseils utiles vous permettant de tirer le meilleur parti possible de vos ressources informatiques. 06/09/85
BU2075 Expos des techniques mdicales et psychologiques les plus rcentes permettant de survivre dans le bureau lectronique. Explications claires et dtailles. 06/12/85
BU7832 Analyse commente des possibilits offertes par les ordinateurs : un guide impartial pour l'utilisateur critique. 06/12/85
MC2222 Recueil de recettes rapides, faciles et lgantes, testes et gotes par des gens qui n'ont jamais le temps de manger. Aide prcieuse pour le cuisinier occasionnel. 06/09/85
MC3021 Adaptation de recettes traditionnelles des provinces franaises - la cuisine au micro-ondes. 06/09/85 MC3026 NULL 17/05/96 PC1035 Etude comparative des progiciels les plus rpandus. S'adressant aux utilisateurs dbutants, cet ouvrage tablit un palmars des logiciels en fonction de leur convivialit. 06/12/85
PC8888 Deux femmes courageuses dvoilent tous les scandales qui jonchent l'irrsistible ascension des pionniers de l'informatique. Matriel et logiciel : personne n'est pargn. 06/12/85
PC9999 La bible des dbutants dans un environnement rseau. 17/05/96 PS1372 Lecture indispensable pour le spcialiste : cet ouvrage tudie les diffrences entre ceux qui dtestent et craignent les ordinateurs et ceux qui les trouvent patants. 10/11/85
PS2091 Etude approfondie des consquences somatiques des motions fortes. De nombreux schmas du mtabolisme illustrent l'expos et en facilitent la comprhension. 06/11/85
PS2106 Comment amortir le choc des interactions quotidiennes par la gymnastique, la mditation et la dittique (nombreux exemples de menus). Bandes vido sur commande pour les exercices physiques. 10/05/85
PS3333 Que se passe-t-il quand les donnes viennent manquer? Analyse scientique des effets du manque d'information sur les grands consommateurs. 06/12/85
PS7777 Comment se protger contre le stress exagr du monde moderne. Parmi les remdes proposs : utilisation de l'ordinateur et alimentation judicieusement choisie. 06/12/85 Table droits_prvus Les auteurs peroivent des droits croissants sur leurs livres, en fonction de la quantit vendue : les droits sont exprims en pourcentage (colonne droits), pour chaque tranche de livres vendus (nombre de livres entre minimum et maximum). Exemple : Si lon vend 3500 livres "BU1035", son auteur percevra 10% sur les 2000 premiers livres, 12% du livre 2001 au 3000, 14% du 3001 au 3500.
Nom_colonne Type de donnes NULL Par dfaut Check Cl/index id_titre idt non CE titres(id_titre) minimum int oui maximum int oui droits int oui
Table ventes Les magasins envoient des commandes aux diteurs. Chaque commande porte sur un ou plusieurs livres. Chaque magasin possde ses propres conventions de numrotation des commandes. Pour dcrire une ligne de commande de faon unique, il faut donc connatre : le magasin qui la mise (colonne id_mag), le numro de commande (num_cmd), le titre du livre command (id_titre). La table Ventes possde donc une cl primaire compose, constitue de ces trois colonnes. Base de donnes : SQL page 22
Nom_colonne Type de donnes NULL Cl/index id_mag char(4) non Compos CP, ordonn. (1) , CE magasins(id_mag) num_cmd varchar(20) non Compos CP, ordonn. (1) date_cmd datetime non qt smallint non modepaiements varchar(12) non id_titre idt non Compos CP, ordonn., (1) CE titres(id_titre)
(1) L'index compos, cl primaire, ordonn est dfini sur id_mag, num_cmd, id_titre.
id_mag num_cmd date_cmd qt modepaiements id_titre 63 6380 722a 09/11/94 3 Net 60 PS2091 7066 A2976 05/12/93 50 Net 30 PC8888 7066 QA7442.3 09/12/94 75 Comptant PS2091 7067 D4482 09/12/94 10 Net 60 PS2091 7131 N914008 09/12/94 20 Net 30 PS2091 7131 N914014 09/12/94 25 Net 30 MC3021 7131 P3087a 05/12/93 20 Net 60 PS1372 7131 P3087a 05/12/93 25 Net 60 PS2106 7131 P3087a 05/12/93 15 Net 60 PS3333 7131 P3087a 05/12/93 25 Net 60 PS7777 7896 QQ2299 10/12/93 15 Net 60 BU7832 7896 TQ456 12/12/93 10 Net 60 MC2222 7896 X999 02/11/93 35 Comptant BU2075 8042 423LL922 09/12/94 15 Comptant MC3021 8042 423LL930 09/12/94 10 Comptant BU1032 8042 P723 03/11/93 25 Net 30 BU1111 8042 QA879.1 05/11/93 30 Net 30 PC1035
Table magasins
Nom_colonne Type de donnes NULL Par dfaut Check Cl/index id_mag char(4) non CP, ordonn. nom_mag varchar(40) oui adresse_mag varchar(40) oui ville varchar(20) oui pays char(2) oui code_postal char(5) oui
id_mag nom_mag adresse_mag ville pays code_postal 6380 Eric the Read Books 788 Catamaugus Ave. Seattle WA 98056 7066 Librairie spcialise 567, Av. de la Victoire Paris FR 75016 7067 Moissons livresques 577, Boulevard Anspach. Bruxelles BE 1000 7131 Doc-U-Mat: Quality Laundry and Books 24-A Avrogado Way Remulade WA 98014 7896 Fricative Bookshop 89 Madison St. Fremont CA 90019 8042 Bookbeat 679 Carson St. Portland OR 89076
Table remises
Les diteurs consentent trois types de remises : des remises client certains magasins privilgis (rfrencs par la colonne id_mag) ; des remises en volume , en fonction de la quantit commande (entre qtmin et qtmax) ; une remise initiale (type FNAC) tous les magasins du groupe.
Nom_colonne Type de donnes NULL Par dfaut Check Cl/index typeremise varchar(40) non id_mag char(4) oui CE magasins(id_mag) qtmin smallint oui qtmax smallint oui remise decimal non
Doc. en Ligne : chapitre Accder aux donnes et les modifier
Requte Select simple sur une seule table Doc. en Ligne : Principe de bases des requtes SQL 2 : p. 43-60
L'instruction SELECT spcifie les colonnes que vous voulez rcuprer. La clause FROM spcifie les tables dans lesquelles se trouvent les colonnes. La clause WHERE spcifie les lignes que vous voulez visualiser dans les tables. Syntaxe simplifie de l'instruction SELECT :
SELECT liste_de_slection FROM liste_de_tables WHERE critres_de_slection
Par exemple, l'instruction SELECT suivante extrait les nom et prnom des crivains de la table auteurs vivant Paris. SELECT pn_auteur, nom_auteur FROM auteurs WHERE ville = 'Paris'
pn_auteur nom_auteur --------- -------------- Charles Mathieu Patricia Merrell Alain D'Autricourt Marc Jalabert Jean-Rmy Facq
Exercice 1 : Afficher le nom, la ville et la rgion de tous les diteurs
Les clauses d'une instruction SELECT doivent tre utilises dans l'ordre dcrit ci-dessus. (Par exemple, si l'instruction comprend une clause GROUP BY et une clause ORDER BY, la clause GROUP BY prcde la clause ORDER BY). Le nom des objets de la base de donnes doit tre dtermin si le choix d'un objet est ambigu : vous pouvez alors prciser le nom de la base de donnes, du propritaire, de la table, en les sparant par des points : base_de_donnes.propritaire.nom_de_table.nom_de_colonne Par exemple, si l'utilisateur suzanne possde la table auteurs dans la base de donnes pubs, l'identificateur unique de la colonne ville dans cette table est: pubs.suzanne.auteurs.ville
Vous pouvez demander un tri en fonction du nom de colonne ou de la position de colonne dans la liste de slection. Les deux requtes suivantes sont quivalentes: SELECT pn_auteur, nom_auteur FROM auteurs ORDER BY nom_auteur
ORDER BY 2
Pour plus d'informations sur SELECT, consultez l'instruction SELECT dans le Manuel de rfrence Transact-SQL (choisissez Select Examples (T-SQL) )
Slection de lignes : clause Where
Les critres de slection, ou conditions, de la clause WHERE peuvent inclure: Des oprateurs de comparaison (tels que =, < >, <, et >) WHERE avance * 2 > cumulannuel_ventes * prix
Des intervalles (BETWEEN et NOT BETWEEN) WHERE cumulannuel_ventes between 4095 and 12000
Des listes (IN, NOT IN) WHERE state in ('BE', 'CH', 'LU')
Des concordances avec des modles (LIKE et NOT LIKE) WHERE tlphone not like '45%'
% Toute chane de zro caractre ou plus _ Tout caractre unique [a-f] Tout caractre de l'intervalle ([a-f]) ou de l'ensemble spcifi ([abcdef]) [^a-f] Tout caractre en dehors de l'intervalle ([^a-f]) ou de l'ensemble spcifi ([^abcdef])
Des valeurs inconnues (IS NULL et IS NOT NULL) where avance is null
Des combinaisons de ces critres (AND, OR) where avance < 30000 or (cumulannuel_ventes > 2000 and cumulannuel_ventes < 2500)
Exercice 2 : LIKE, BETWEEN, AND Base de donnes : SQL page 25
Afficher le nom, le prnom, et la date dembauche des employs embauchs en 90, dont le nom commence par L, et la position est comprise entre 10 et 100
Exercice 3 : ORDER BY
Afficher le nom et la date dembauche des employs, classs par leur identificateur dditeur, puis par leur nom de famille (sous-critre)
Exercice 4 : IN, ORDER BY
Afficher le nom, le pays et ladresse des auteurs Franais, Suisse ou Belge, classs par pays.
Expressions et fonctions
Les 4 oprateurs arithmtiques de base peuvent tre utiliss dans les clauses SELECT, WHERE et ORDER pour affiner les recherches partout o il est possible d'utiliser une valeur d'attribut : Livres qui reoivent une avance sur vente suprieure 500 fois leur prix : SELECT titre, prix, avance FROM titres WHERE avance > = 500 * prix Suivant les systmes la gamme des oprateurs et des fonctions utilisables peut tre trs volue : elle comporte toujours des fonctions de traitement de chanes de caractres, des oprateurs sur les dates, etc... Cet exemple dtermine la diffrence en jours entre la date courante et la date de publication : SELECT newdate = DATEDIFF(day, datepub, getdate()) FROM titres
Requte sur les groupes : GROUP BY, fonctions de groupe, HAVING Doc. en ligne Concepts de requtes avances : Regroupement de lignes laide de Group by
La clause GROUP BY est employe dans les instructions SELECT pour diviser une table en groupes. Vous pouvez regrouper vos donnes par nom de colonne ou en fonction des rsultats des colonnes calcules lorsque vous utilisez des donnes numriques. L'instruction suivante calcule l'avance moyenne et la somme des ventes annuelles cumules pour chaque type de livre:
SELECT type, AVG(avance), SUM(cumulannuel_ventes) FROM titres GROUP BY type
type ------------ ----------------------- ----------- cui_moderne 51,000.00 24278 cui_traditio 43,000.00 19566 gestion 43,000.00 30788 informatique 51,000.00 12875 psychologie 29,000.00 9939 SANS TITRE (null) (null) (6 ligne(s) affecte(s)) Base de donnes : SQL page 26
Les fonctions de groupe (ou dagrgation ) effectuent un calcul sur l'ensemble des valeurs d'un attribut d'un groupe de tuples. Un groupe est un sous ensemble des tuples d'une table tel que la valeur d'un attribut y reste constante ; un groupe est spcifi au moyen de la clause GROUP BY suivi du nom de l'attribut l'origine du groupement. En l'absence de cette clause tous les tuples slectionns forment le groupe. COUNT, compte les occurrences pour un attribut, SUM, somme les valeurs de l'attribut (de type numrique), AVG, fait la moyenne (Average) des valeurs de l'attribut, MAX, MIN, donne la valeur MAX et la valeur MIN de l'attribut.
Ces fonctions imposent la spcification de l'attribut en tant qu'argument. Si cet argument est prcd du mot cl DISTINCT les rptitions sont limines. D'autre part, les valeurs indtermines (= NULL) ne sont pas prises en compte. La clause HAVING est quivalente WHERE mais elle se rapporte aux groupes. Elle porte en gnral sur la valeur dune fonction de groupe : seuls les groupes rpondant au critre spcifi par HAVING feront parti du rsultat. Regrouper les titres en fonction du type, en liminant les groupes qui contienne un seul livre SELECT type FROM titres GROUP BY type HAVING COUNT(*) > 1
type ------------ cui_moderne cui_traditio gestion informatique psychologie
Regrouper les titres en fonction du type, en se limitant aux types qui dbutent pas par la lettre c SELECT type FROM titres GROUP BY type HAVING type LIKE 'c%'
type ------------ cui_moderne cui_traditio
Regrouper les titres en fonction du type par diteur, en incluant seulement les diteurs dont le numro d'identification est suprieur 0800 et qui ont consenti des avances pour un total suprieur 90 000 FF, et qui vendent des livres pour un prix moyen infrieur 150 FF: SELECT id_diteur, SUM(avance), AVG(prix) FROM titres GROUP BY id_diteur HAVING SUM(avance) > 90000 AND AVG(prix) < 150 AND id_diteur > '0800' Base de donnes : SQL page 27
Mme exemple, en liminant les titres dont le prix est infrieur 60 FF, et en triant les rsultats en fonction des numros d'identification des diteurs: SELECT id_diteur, SUM(avance), AVG(prix) FROM titres WHERE prix >= 60 GROUP BY id_diteur HAVING SUM(avance) > 90000 AND AVG(prix) < 150 AND id_diteur > '0800' ORDER BY id_diteur
Exercice 5 : GROUP BY, COUNT, MIN, MAX Pour chaque niveau demploi (table employs, colonne position_employ) afficher le nombre demploys de ce niveau, la date dembauche du salari le plus ancien et du plus rcent dans le niveau
Exercice 6 : GROUP BY, MAX Pour chaque Identificateur de titre, calculer les droits prvus maximum (table droits_prvus, colonne droits)
Exercice 7 : GROUP BY, clause sur un sous-ensemble HAVING Afficher le nombre des diteurs regroups par pays, en se limitant aux pays dont le nom contient un 'S' ou un 'R'
Infos de dtails ET infos globales : COMPUTE La clause COMPUTE est employe dans des instructions SELECT avec des fonctions d'agrgation ligne SUM, AVG, MIN, MAX et COUNT pour gnrer des valeurs statistiques partir de valeurs contenues dans des groupes de lignes. Ces valeurs statistiques apparaissent sous forme de lignes supplmentaires dans les rsultats de la requte, ce qui vous permet de visualiser les lignes dtail et les lignes de statistiques dans un seul ensemble de rsultats.. Exemple : somme des prix des diffrents types de livres de cuisine
SELECT type, prix FROM titres WHERE type like 'cui%' ORDER BY type, prix COMPUTE SUM(prix) BY type
type prix ------------ -------------------------- cui_moderne 21.00 cui_moderne 136.00 sum ========================== 157.00
Exercice 8 : COMPUTE Base de donnes : SQL page 28
Pour chaque niveau de droits, afficher les identificateurs des livres correspondant, le min et la max de ventes donnant droit ce niveau (infos de dtails), et le nombre de livres dans le niveau (rcapitulatif)
Afficher les noms dauteurs, leur pays et leur ville en les classant par ville (infos de dtail), et le nombre dauteurs par pays (rcapitulatif)
Travail sur plusieurs tables : les jointures Doc. en ligne : Principe de base des jointures SQL2 : p. 61 78
Les oprations de jointure permettent d'extraire des donnes partir de plusieurs tables ou vues dans la mme base de donnes ou dans des bases diffrentes en n'effectuant qu'une seule opration. Joindre deux ou plusieurs tables revient comparer les donnes de colonnes spcifiques, et ensuite utiliser les lignes slectionnes dans les rsultats de cette comparaison pour crer une nouvelle table.
Une instruction de jointure: spcifie une colonne dans chaque table ; compare les valeurs de ces colonnes ligne par ligne ; forme de nouvelles lignes en combinant les lignes qui contiennent les valeurs retenues dans la comparaison.
Exemple de jointure : nom des auteurs et des diteurs vivant dans la mme ville : SELECT pn_auteur, nom_auteur, nom_diteur FROM auteurs, diteurs WHERE auteurs.ville = diteurs.ville
SELECT pn_auteur, nom_auteur, nom_diteur FROM auteurs JOIN diteurs on auteurs.ville = diteurs.ville
Exercice 9 : Jointure entre trois tables Afficher les noms des auteurs parisiens, les titres et les prix de leurs livres
Exercice 10 : Jointure sur quatre tables, ORDER BY, COMPUTE Pour chaque diteur, afficher le nom de lditeur, les titres des livres quil publie, les noms des magasins o ils sont vendus, le nombre dexemplaires vendus dans chaque magasin, et le nombre dexemplaires vendus au total par chaque diteur :
nom_diteur titre nom_mag qt ---------------------------------------- -------------------------------------------------------------------------------- ---------------------------------------- ------ Algodata Infosystems Guide des bases de donnes du gestionnaire press Eric the Read Books 5 Algodata Infosystems Guide des bases de donnes du gestionnaire press Bookbeat 10 Algodata Infosystems La cuisine - l'ordinateur : bilans clandestins Bookbeat 25 Algodata Infosystems Toute la vrit sur les ordinateurs Fricative Bookshop 15
sum ====== 55
nom_diteur titre nom_mag qt ---------------------------------------- -------------------------------------------------------------------------------- ---------------------------------------- ------ Binnet & Hardley Les festins de Parly 2 Fricative Bookshop 10 Binnet & Hardley Les micro-ondes par gourmandise Doc-U-Mat: Quality Laundry and Books 25
sum ====== 35 Exercice 11 : jointure sur 4 tables, GROUP BY, HAVING, SUM Afficher les noms des auteurs qui ont vendu au moins 20 livres, et le nombre de livres quils ont vendus (tables auteurs, titreauteur, titres, ventes)
Les sous-requtes Doc. en ligne : Concepts de requtes avances : Principe de base des sous- requtes
Une sous-requte est une instruction SELECT imbrique l'intrieur d'une instruction SELECT, INSERT, UPDATE ou DELETE, ou d'une autre sous-requte : une sous-requte peut porter sur la mme table que la requte externe ou sur une autre table. Dans Transact-SQL, une sous-requte qui renvoie une seule valeur peut s'employer dans toutes les circonstances o une expression est autorise. Les instructions SELECT qui incluent au moins une sous-requte sont parfois appeles requtes imbriques ou instructions SELECT imbriques. Le fait d'imbriquer une instruction SELECT l'intrieur d'une autre explique la prsence du mot structur dans l'expression langage d'interrogation structur (SQL, Structured Query Language). Une sous-requte imbrique dans une instruction SELECT externe prsente la syntaxe suivante: (SELECT [ALL | DISTINCT] liste_de_slection_de_la_sous-requte [FROM {nom_de_table | nom_de_vue}[conseils-optimiseur] Base de donnes : SQL page 30
[[, {nom_de_table2 | nom_de_vue2}[conseils-optimiseur] [..., {nom_de_table16 | nom_de_vue16}[conseils-optimiseur]]] [clause WHERE] [clause GROUP BY] [clause HAVING]) L'instruction SELECT d'une sous-requte se place toujours entre parenthses. Elle ne peut pas contenir de clause ORDER BY ou COMPUTE. Une sous-requte peut s'imbriquer dans une clause WHERE, ou HAVING d'une instruction externe SELECT, INSERT, UPDATE ou DELETE, ou dans une autre sous-requte. Le niveau d'imbrication n'est pas limit. A noter le cas particulier des requtes imbriques places aprs le SELECT, qui permettent dafficher une colonne calcule (Cf. Exercice 14). Il existe deux catgories de sous-requtes : les sous-requtes qui renvoient une et une seule valeur directement manipulable par des oprateurs de comparaison, et les requtes ensemblistes qui renvoient des listes manipulables par les oprateurs ensemblistes IN, ANY , ALL, EXISTS
Mthode de construction des sous-requtes renvoyant une et une seule valeur
Pour trouver tous les livres de mme prix que le livre Toute la vrit sur les ordinateurs , on peut procder en deux tapes, en cherchant dabord le prix du livre Toute la vrit sur les ordinateurs :
SELECT prix FROM titres WHERE titre = 'Toute la vrit sur les ordinateurs'
prix ------ 136,00
Puis, en utilisant ce rsultat dans une seconde requte pour trouver les livres qui ont le mme prix :
SELECT titre, prix FROM titres WHERE prix = 136
titre prix --------------------- ------------------------- ------------- Toute la vrit sur les ordinateurs 136,00 Les festins de Parly 2 136,00 Les secrets de la Silicon Valley 136,00 Privation durable d'informations : tude 136,00
En substituant la constante 136, la requte qui calcule ce prix, on obtient la solution avec sous- requte :
SELECT titre, prix FROM titres WHERE prix = (SELECT prix FROM titres WHERE titre = 'Toute la vrit sur les ordinateurs')
Base de donnes : SQL page 31
Avec la mme dmarche de construction progressive, on peut rpondre des questions plus complexes : dans tous les cas, il faut reprer dans la question, la proposition principale qui fournit la requte principale et les propositions subordonnes qui fournissent les critres de choix ; chaque subordonne devient une requte imbrique qu'il faudra d'abord tester indpendamment, sur un cas particulier. Exemple : Afficher les titres des livres dont le prix est suprieur ou gal au tiers du prix maximum, et infrieur ou gal la moyenne des prix. -- 1) trouver le prix maximum SELECT max(prix) FROM titres -- => 156.00
-- 2) trouver la moyenne des prix SELECT avg(prix) FROM titres -- => 99.4 -- 3) Ecrire la requte principale avec ces constantes SELECT titre FROM titres WHERE (prix >= 156.0/3) and (prix <= 99.4)
-- 4) Rcrire la requte principale en substituant les requtes imbriques aux 2 constantes SELECT titre FROM titres WHERE prix >= (SELECT max(prix) FROM titres ) /3 and prix <= (SELECT avg(prix) FROM titres )
Sous-requtes ensemblistes Utilisation de IN et EXISTS pour tester lappartenance dun nuple une liste construite par une requte imbrique
Exemple : Afficher les noms et les prnoms des auteurs qui ont crit au moins un livre (donc qui figurent dans la table titreauteur)
Avec loprateur IN :
SELECT nom_auteur, pn_auteur FROM auteurs au WHERE id_auteur IN (SELECT id_auteur FROM titreauteur) Order by nom_auteur
Avec loprateur EXISTS :
Base de donnes : SQL page 32
SELECT nom_auteur, pn_auteur FROM auteurs au WHERE EXISTS (SELECT id_auteur FROM titreauteur WHERE id_auteur = au.id_auteur) Order by nom_auteur
Remarquer la jointure supplmentaire entre la table auteurs de la requte principale et la table titreauteur de la requte imbrique, par rapport la solution avec loprateur IN
Dans ce cas particulier, le problme est rductible une requte simple, sans sous-requte :
SELECT DISTINCT nom_auteur, pn_auteur FROM auteurs au, titreauteur ti WHERE au.id_auteur = ti.id_auteur ORDER BY nom_auteur, pn_auteur
Sous-requtes oprant sur des listes, introduites par un oprateur de comparaison modifi par ANY ou ALL : Exemple 1 : Afficher les noms et les prnoms des auteurs dont tous les livres ont un prix de 136 F
SELECT nom_auteur, pn_auteur FROM auteurs au WHERE 136 = ALL (SELECT prix FROM titres t, titreauteur ta WHERE t.id_titre = ta.id_titre AND au.id_auteur = ta.id_auteur) ORDER BY nom_auteur, pn_auteur
e Lorsquune requte imbrique ne renvoie rien, toutes les expressions avec loprateur ALL sont vraies : on peut tout dire de lensemble vide. La requte ci-dessus trouve donc les auteurs recherchs, dont tous les livres valent 136 F, mais aussi les auteurs qui nont pas encore publi de livres (et ne figurent donc pas dans la table titreauteur) Pour sassurer du bon fonctionnement de loprateur ALL, il faut toujours doubler la sous-requte avec ALL dune sous-requte dexistence :
SELECT nom_auteur, pn_auteur FROM auteurs au WHERE id_auteur IN (SELECT id_auteur FROM titreauteur) and 136 = ALL ( SELECT prix FROM titres t, titreauteur ta WHERE t.id_titre = ta.id_titre AND au.id_auteur = ta.id_auteur) ORDER BY nom_auteur, pn_auteur
Exemple 2 : Afficher les noms et les prnoms des auteurs dont au moins un livre a un prix de 136F SELECT nom_auteur, pn_auteur Base de donnes : SQL page 33
FROM auteurs au WHERE 136 = ANY (SELECT prix FROM titres t, titreauteur ta WHERE au.id_auteur = ta.id_auteur AND t.id_titre = ta.id_titre) ORDER BY nom_auteur, pn_auteur
Si lensemble construit par la sous-requte est vide, toutes les comparaisons contruites sur loprateur ANY sont fausses : il est inutile de doubler les sous-requtes avec ANY dun test dexistence.
Exercice 12 : 2 sous-requtes, EXIST, ALL Afficher les noms et prnoms par ordre alphabtique des auteurs qui possdent 100% de droits sur tous leurs livres ! (titreauteur.droits_pourcent = 100 pour tous les livres)
Exercice 13 : 1 sous-requte, MAX Afficher le titre du livre le plus cher (maximum de titre.prix)
Exercice 14 : 1 sous-requte utilise dans la clause SELECT, SUM Afficher la liste des titres dans lordre alphabtique et le cumul de leurs ventes, tous magasins confondus (tables titres et ventes)
Exercice 15 : 1 sous-requte, MAX Afficher le titre du livre le plus vendu de tous les magasins, et le nom du magasin
Exercice 15 bis : Afficher le nom et lidentificateur des diteurs qui ditent de la gestion et pas dinformatique
Afficher le nom et lidentificateur des diteurs qui ne font pas davance sur tous leurs livres
Loprateur ensembliste UNION Doc. en ligne : Concepts de requtes avances : Combinaison des rsultats avec UNION
Exemple : Noms, prnoms des auteurs habitant Genve ou Paris
SELECT nom_auteur, pn_auteur FROM auteurs WHERE ville = 'Genve' UNION SELECT nom_auteur,pn_auteur FROM auteurs WHERE ville = 'Paris' Base de donnes : SQL page 34
Synthse sur les principes dcriture dune requte SELECT
dterminer les tables utilises et les indiquer dans la clause FROM,
lister les attributs visualiser dans la clause SELECT,
si la clause SELECT comporte des fonctions de groupes, utiliser une clause GROUP BY reprenant tous les attributs cits dans le SELECT, sauf les fonctions de groupe,
fixer les critres de recherche par HAVING sur les groupes et par WHERE sur des valeurs individuelles,
pour utiliser une fonction sur les groupes dans un WHERE ou s'il faut utiliser une valeur d'attribut d'une autre table utiliser une requte imbrique,
pour fusionner les rsultats de deux clauses SELECT utiliser l'oprateur UNION,
prciser l'ordre de rangement des rsultats par une clause ORDER BY
Jointures ou SELECT imbriques ?
une jointure est indispensable pour traduire une requte o il s'agit de visualiser des informations manant de plusieurs tables. lorsqu'il faut extraire des informations d'une table et qu'une autre table est ncessaire pour conditionner la slection des tuples de la premire une requte imbrique s'impose. Base de donnes : SQL page 35
2.4 Mise jour dune base de donnes
Doc. en ligne : Accder aux donnes et les modifier : Ajout, Modification, Suppression de donnes SQL2 : p. 79 82
Dans SQL Server, vous pouvez ajouter ou modifier des donnes au moyen des instructions de modification de donnes INSERT, DELETE, et UPDATE - INSERT ajoute une nouvelle ligne une table ; - DELETE supprime une ou plusieurs lignes ; - UPDATE modifie les lignes ; Vous pouvez modifier des donnes dans une seule table par instruction. Transact-SQL vous permet de baser vos modifications sur des donnes contenues dans d'autres tables, mme celles d'autres bases de donnes.
Ajout de lignes : INSERT
Le mot-cl VALUES est utilis pour spcifier les valeurs de certaines ou de toutes les colonnes dans une nouvelle ligne : INSERT nom_de_table VALUES (constante1, constante2, ...) Ajout de toutes les colonnes dune ligne : INSERT titres VALUES ('BU2222', 'Plus vite!', 'gestion', '1389', NULL, NULL, NULL, NULL, 'ok', '14/06/95')
Ajout de certaines colonnes : les colonnes ignores doivent tre dfinies pour permettre des valeurs NULL. Si vous sautez une colonne avec la contrainte DEFAULT, sa valeur par dfaut est utilise. INSERT INTO magasins (id_mag, nom_mag) VALUES ('1229', 'Les livres de Marie')
Vous pouvez galement utiliser une instruction SELECT dans une instruction INSERT pour insrer des valeurs slectionnes dans une ou plusieurs autres tables ou vues. Voici la syntaxe simplifie : INSERT nom_de_table SELECT liste_de_colonne FROM liste_de_table WHERE critres_de_slection Insertion de donnes provenant de la mme table par une instruction SELECT : INSERT diteurs SELECT '9980', 'test', ville, rgion, pays FROM diteurs WHERE nom_diteur = 'New Moon Books' Base de donnes : SQL page 36
Nouveau contenu de la table : id_diteur nom_diteur ville rgion pays ------ ----------------------- ----------- ----- 0736 New Moon Books Boston MA USA 0877 Binnet & Hardley Washington DC USA 1389 Algodata Infosystems Bruxelles BE 1622 Five Lakes Publishing Chicago IL USA 1756 Ramona, diteur Lausanne CH 9901 GGG&G Munich (null) GER 9952 Scootney Books New York NY USA 9980 test Boston MA USA 9999 Editions Lucerne Paris (null) FR
Insertion de donnes provenant dune autre table, colonnes dans le mme ordre : INSERT auteurs SELECT * FROM nouveaux_auteurs
Insertion de donnes provenant dune autre table, colonnes dans un autre ordre : la table auteurs contient les colonnes id_auteur, pn_auteur, nom_auteur et adresse, la table nouveaux_auteurs contient les colonnes id_auteur, adresse, pn_auteur et nom_auteur . INSERT auteurs (id_auteur, adresse, nom_auteur, pn_auteur) SELECT * FROM nouveaux_auteurs ou INSERT auteurs SELECT id_auteur, pn_auteur, nom_auteur, adresse FROM nouveaux_auteurs
Exercice 16 : Rentrer vos noms, prnoms, dans la table auteurs, avec un identificateur qui nexiste pas dj. Tous les champs obligatoires (non NULL) doivent tre renseigns, sauf ceux qui possdent une valeur par dfaut (tlphone). Rafficher la table. Relancer la mme requte et interprter le message derreur.
Exercice 17 : Recopier toutes les caractristiques dun auteur en lui donnant un nouvel identificateur, et un nouveau nom.
Modification de lignes : UPDATE Arthur Bec dcide par exemple de modifier son nom en Roland Perceval. Voici comment modifier sa ligne dans la table auteurs : UPDATE auteurs SET nom_auteur = 'Perceval', pn_auteur = 'Roland' WHERE nom_auteur = 'Bec'
Mise jour de la colonne cumulannuel_ventes de la table titres, avec la somme des ventes les plus rcentes enregistres dans la table ventes : UPDATE titres SET cumulannuel_ventes = cumulannuel_ventes + (SELECT SUM(qt) FROM ventes WHERE ventes.id_titre = titres.id_titre AND ventes.date_cmd IN (SELECT MAX(date_cmd) FROM ventes)) Base de donnes : SQL page 37
Exercice 18 : Augmenter de 10% tous les prix des livres de lditeur Algodata Infosystems. Vrifier lopration par une commande Select adquate, avant et aprs laugmentation.
Suppression de lignes : DELETE
Supposons qu'une opration complexe dbouche sur l'acquisition de tous les auteurs de Bruxelles et de leurs ouvrages par un autre diteur. Vous devez immdiatement supprimer tous ces ouvrages de la table titres, mais vous ne connaissez pas leur titre ni leur numro d'identification. La seule information dont vous disposez concerne le nom de la ville o rsident ces auteurs. Vous pouvez effacer les lignes dans la table titres en retrouvant les numros d'identification des auteurs pour les lignes qui ont Bruxelles comme ville dans la table auteurs, et en utilisant ensuite ces numros pour trouver les numros d'identification des ouvrages dans la table titreauteur. En d'autres termes, une triple jointure est requise pour trouver les lignes que vous souhaitez effacer dans la table titres. Les trois tables sont donc comprises dans la clause FROM de l'instruction DELETE. Toutefois, seules les lignes dans la table titres qui rpondent aux conditions de la clause WHERE sont effaces. Vous devez effectuer des effacements spars pour supprimer les lignes pertinentes dans les autres tables que la table titres. DELETE titres FROM auteurs, titres, titreauteur WHERE titres.id_titre = titreauteur.id_titre AND auteurs.id_auteur = titreauteur.id_auteur AND ville = 'Bruxelles'
Remarque La relation cl primaire/cl trangre entre titres.id_titre et titreauteur.id_titre vous empche d'excuter cet effacement parce que la cl trangre ne permettra pas que vous effaciez des titres ecore rfrences dans titreauteur : effacez en premier ces rfrences
Exercice 19 : Dtruire les lignes cres dans la table auteur, dans les exercices 16 et 17, afin de remettre la table dans son tat initial.
Base de donnes : SQL page 38
3. CREATION DE LA BASE COMPAGNIE AERIENNE Doc. en ligne : Crer et maintenir des bases de donnes
3.1 Introduction
Dans ce chapitre, on va construire compltement la base de donnes Compagnie Arienne qui a t prsente au dbut. Ladministrateur (compte sa) vous a accord le droit de crer une nouvelle base de donne, dont vous serez propritaire (compte dbo, data base owner ) : le dbo a tous les droits sur sa base, de mme que ladministrateur a tous les droits sur la totalit du SGBDR.
Loguez vous avec lAnalyseur de requte , sous votre nom de connexion NT habituel, sans mot de passe, et tapez la requte SQL de cration de base de donnes : CREATE DATABASE AirXXX
3.2 Cration des domaines Doc. en ligne : Accder aux donnes et les modifier : Elments de syntaxe Transact SQL -> Utilisation des types de donnes
La premire tape consiste crer des domaines , cest--dire des types de donnes, qui sappliqueront aux colonnes ou attributs des tables et des colonnes. Comme en C ou en Pascal, les domaines sont dfinis par le propritaire de la base de donnes, partir des types prdfinis du langage SQL :
bit entier dont la valeur est 1 ou 0. tinyint entier dont la valeur est comprise entre 0 et 255. smallint entier dont la valeur est comprise entre -2 15 (-32 768) et 2 15 - 1 (32 767). int entier dont la valeur est comprise entre -2 31 (-2 147 483 648) et 2 31 - 1 (2 147 483 647).
decimal Donnes numriques fixes de prcision et d'chelle comprises entre -10 38 -1 et 10 38 -1. numeric Synonyme de decimal.
smallmoney Valeurs de donnes montaires comprises entre - 214 748,3648 et +214 748,3647, avec une prcision d'un dix-millime d'unit montaire. money Valeurs de donnes montaires comprises entre -2 63 (-922 337 203 685 477,580 8) et 2 63 - 1 (+922 337 203 685 477,580 7), avec une prcision d'un dix-millime d'unit montaire. real Donnes numriques de prcision en virgule flottante comprises entre -3.40E + 38 et 3.40E + 38. Base de donnes : SQL page 39
float Donnes numriques de prcision en virgule flottante comprises entre -1.79E + 308 et 1.79E + 308. smalldatetime Donnes de date et d'heure comprise entre le 1 er janvier 1900 et le 6 juin 2079, avec une prcision d'une minute. datetime Donnes de date et d'heure comprises entre le 1 er janvier 1753 et le 31 dcembre 9999, avec une prcision de trois centimes de seconde ou de 3,33 millisecondes. char chane de caractres de longueur fixe d'un maximum de 8 000 caractres. varchar chane de caractres de longueur variable d'un maximum de 8 000 caractres. text texte de longueur variable ne pouvant pas dpasser 2 31 - 1 (2 147 483 647) caractres. binary donnes binaires de longueur fixe ne pouvant pas dpasser 8 000 octets. varbinary Donnes binaires de longueur variable ne pouvant pas dpasser 8 000 octets. image Donnes binaires de longueur variable ne pouvant pas dpasser 2 31 - 1 (2 147 483 647) octets.
La syntaxe pour crer des nouveaux types ne fait pas partie de la norme ANSI du SQL. Sous SQL SERVER il faut appeler la procdure systme sp_addtype (system procedure add type), par le mot cl execute execute sp_addtype TypeNom, 'VARCHAR(50)', 'NOT NULL'
nom_de_type : Nom du type de donnes dfini par l'utilisateur.
type_physique : Nom du type de donnes physique prdfini de SQL Server sur lequel repose le type de donnes dfini par l'utilisateur.
contrainte_de_valeur_NULL : Paramtre indiquant comment grer des valeurs NULL dans un type de donnes dfini par l'utilisateur (vaut NULL ou NOT NULL).
SQL Server ne fait pas de diffrence entre les majuscules et les minuscules pour les noms de type de donnes systme.
Exercice 20
Les exercices qui suivent vont vous guider pour crire un script de cration de base de donnes : Creer.SQL.
On commentera chacune des tapes du script (commentaire Transact SQL : /* plusieurs lignes */ ou -- fin de ligne)
On dveloppera en parallle un script Supprimer.SQL qui supprime tous les objets que lon vient de traiter. Aprs chaque exercice, on relancera les scripts de suppression et de cration, pour sassurer que tous les objets se crent correctement.
A la fin de ce chapitre, on doit donc aboutir deux scripts complets qui permettent de maintenir la base (en la recrant compltement en cas de crash systme)
Etape 1 : cration des types utilisateurs :
TypeDate : type prdfini datetime. Obligatoire. (=> date du vol dans la table Affectation). Base de donnes : SQL page 40
TypeHoraire : type prdfini smalldatetime. Obligatoire (=> heures de dpart et darrive, dans la table Vol)
TypeNom : chane variable limite 50 caractres. Obligatoire. (=> nom du pilote dans la table Pilote et du constructeur dans la table Constructeur)
TypePrenom : chane variable limite 30 caractres. Optionnel. (=> prnom du pilote dans la table Pilote)
TypeAvion : chane variable limite 20 caractres. Obligatoire. (=> type davion dans les tables Type et Avion)
TypeIdConstructeur : entier (smallint). Obligatoire (=> identificateur du constructeur dans la table Constructeur)
TypeIdAeroport : chane fixe de 3 caractres. Obligatoire. (=> identificateur de laroport dans la table Aroport)
TypeIdPilote : entier (smallint). Obligatoire ( => identificateur du pilote dans la table Pilote)
TypeNumVol : chane fixe de 5 caractres. Obligatoire (=> identificateur du vol dans la table Vol)
TypeVille : chane variable limite 50 caractres. Optionnel. (=> nom de laroport et de la ville desservie dans la table Aeroport)
Avec Enterprise Manager - lancer loutil par le menu SQL Server 7.0 - Menu Action , Enregistrer un nouveau serveur SQL Server pour accder au serveur : sans utiliser lassistant, choisir le nom du serveur dans la liste droulante, choisir Utiliser lauthentification SQL Server, entrer votre nom de connexion et votre mot de passe - Fermer la fentre dinscription du serveur, et dvelopper les objets de la base en cliquant sur le + ct du nom du Serveur ( licne avec flche verte) - Dvelopper Bases de donnes : seules les bases de donnes auxquelles vous avez accs apparaissent. Dvelopper la base en cours de construction, et le rpertoire Types de donnes utilisateurs . Base de donnes : SQL page 41
3.3 Cration et suppression de tables. Contraintes dintgrit
Doc. en ligne : Crer et maintenir des bases de donnes : Tables
Cls primaires et trangres La cl primaire est une colonne ou une combinaison de colonnes dont les valeurs identifient de faon unique chaque ligne dans la table : elle ne peut pas tre nulle. On cre une cl primaire grce la contrainte PRIMARY KEY lors de la cration ou de la modification dune table. SQL cre automatiquement un objet index pour la cl primaire : lindex assure lunicit de la cl primaire dans la table, et permet un accs rapide aux donnes par la cl primaire. Une cl trangre est une colonne ou une combinaison de colonnes dont les valeurs correspondent la cl primaire d'une autre table. Elle nest pas obligatoirement unique ni dfinie (peut tre NULL), mais ses valeurs doivent correspondre des valeurs existantes de la cl primaire. On cre une cl trangre par la contrainte FOREIGN KEY lors de la cration ou de la modification dune table.
Intgrit des donnes dans une base Assurer l'intgrit des donnes, cest prserver la cohrence et l'exactitude des donnes stockes dans une base de donnes en validant le contenu des diffrents champs, en vrifiant la valeur des champs l'un par rapport l'autre, en validant les donnes dans une table par rapport une autre, et en vrifiant que la mise jour d'une base de donnes est efficacement et correctement effectue pour chaque transaction. 4 contraintes dintgrit : = Intgrit dentit : unicit de la cl primaire (PRIMARY KEY) ou dautres cls (UNIQUE) = Intgrit de domaine : plage des valeurs possibles pour une colonne. On peut restreindre cette plage en attribuant la colonne un type dfini par lutilisateur, ou par une contrainte CHECK avec une rgle. = L'intgrit rfrentielle garantit la relation entre une cl primaire unique dans une table et les cls trangres qui y font rfrence dans les autres tables. Exemple : avant de supprimer une ligne dans la table PILOTE, il faut supprimer toutes les lignes de la table VOL qui font rfrence ce pilote. Pour assurer lintgrit rfrentielle, SQL Server interdit de : - ajouter des enregistrements une table lie lorsqu'il n'y a aucun enregistrement associ dans la table primaire ; - changer des valeurs ou effacer des enregistrements dans une table primaire qui engendrerait des enregistrements orphelins dans une table lie; Par exemple, avec les tables ventes et titres dans la base de donnes pubs, l'intgrit rfrentielle est base sur la relation entre la cl trangre (id_titre) de la table ventes et la cl primaire (id_titre) de la table titres, comme le montre l'illustration suivante: Base de donnes : SQL page 42
Exemples de cration de table : CreateTable
Vous pouvez crer des tables permanentes ou des tables temporaires (locales ou globales). Une table temporaire locale est visible uniquement pour la connexion qui l'a cre. Une table temporaire globale est disponible pour toutes les connexions. Les tables temporaires locales sont supprimes automatiquement la fin de la session courante. Les tables temporaires globales sont supprimes la fin de la dernire session qui les utilise Lorsque vous crez une table, nommez ses colonnes, dfinissez un type de donne pour chaque colonne, prcisez si elles peuvent contenir des valeurs NULL, dfinissez des contraintes par loption CHECK, des valeurs par dfaut par DEFAULT
FOREIGN KEY : la cl fait rfrence la cl primaire dune autre table. id_emploi smallint NOT NULL DEFAULT 1 REFERENCES emplois(id_emploi) ou id_emploi smallint et plus loin FOREIGN KEY (id_emploi) REFERENCES emplois (id_emploi)
DEFAULT : valeur par dfaut lorquaucune valeur nest donne dans INSERT ou UPDATE CHECK : CHECK (id_diteur IN ('1389', '0736', '0877', '1622', '1756') OR id_diteur LIKE '99[0-9][0-9]')
Cl primaire Valeur par dfaut Contrainte Base de donnes : SQL page 43
CHECK (niv_min >= 10)
ou avec mot cl CONSTRAINT : CONSTRAINT CK_id_employ CHECK (id_employ LIKE '[0-9][0-9][0-9][0-9][FM]' )
IDENTITY : valeur numrique autoincrmentale (valeur initiale et valeur de lincrment) IDENTITY(10,3) (=> valeurs: 10, 13, 16)
Exercice 21 : Cration des tables et des contraintes
Complter le script de cration pour crer les tables de la base Compagnie arienne , dcrite dans le schma gnral. Pour chaque table, on dfinira les liens cl trangre-cl primaire en suivant le schma.
Dfinitions de contraintes supplmentaires sur les tables :
AVION : la cl primaire NumAvion est autoincrmente partir de 100, par pas de 1.
TYPE : la cl primaire TypeAvion commence obligatoirement par une lettre la capacit est comprise entre 50 et 400 : cette colonne est obligatoire, avec un dfaut de 100
CONSTRUCTEUR : la cl primaire IdConstructeur est autoincrmente partir de 1, par pas de 1
PILOTE : la cl primaire IdPilote est autoincrmente partir de 1, par pas de 1
AEROPORT : la cl primaire IdAeroport ne comporte que des lettres la colonne NomVilleDesservie est optionnelle la colonne NomAeroport est obligatoire
VOL : la cl primaire NumVol est constitue du prfixe " IT" suivi de trois chiffres
AFFECTATION : la cl primaire est compose des colonnes NumVol et DateVol la cl trangre IdPilote peut tre NULL (en attente daffectation un pilote) Commencer par tablir la liste de dpendance : - numroter 0 les tables indpendantes, 1 les tables qui ne dpendent que de tables indpendantes, 2 celles qui dpendent des prcdentes - crer les tables en commenant par les indpendantes, et en suivant lordre de la liste de dpendance.
Vrifier la cration des tables sous Entreprise Manager
Exercice 22 : Script de test
Tester les contraintes dintgrit en faisant des essais de remplissage par linstruction INSERT et des suppressions par DELETE : vrifier les valeurs par dfaut, les domaines de validit des colonnes Partir des valeurs dcrites dans le chapitre I, en remplissant les tables dans lordre de la liste de dpendance.
Nom contrainte Base de donnes : SQL page 44
Exercice 23 : Script de destruction des types utilisateurs et des tables
Pour dtruire une table : DROP TABLE AVION GO Le GO oblige le moteur faire la suppression immdiatement et permet de recrer la table ( sinon erreur Il y a dj un objet Avion dans la base de donnes )
Attention : il faut dtruire les tables dans lordre inverse de la cration, en supprimant dabord les tables dpendantes
Dtruire les types la fin, quand ils ne sont plus utiliss par aucune table : exec sp_droptype TypeNom
Avec Enterprise Manager
Dans le rpertoire Bases de donnes , Tables , visualisez et vrifiez les tables et leurs contraintes. = Pour visualiser les proprits dune table, double-clicker sur son nom, ou avec le bouton droit de la souris, choisir Modifier une table = Pour obtenir les dtails sur les contraintes, et les cls trangres : cliquer sur le bouton Proprit de table et dindex , dans la fentre de modification de table.
Base de donnes : SQL page 45
3.4 Cration de vues
Doc. en ligne : Crer et maintenir des bases de donnes : Vues SQL2 : p. 133 149
Quand utiliser des vues ?
Une vue est une table virtuelle dont le contenu est dfini par une requte SELECT. Comme une table relle, la vue possde des colonnes nommes et des lignes de donnes, mais elle nest pas stocke dans la base de donnes, et na pas dexistence propre, indpendamment des tables. Les vues amliorent la scurit en permettant de contrler les donnes que les utilisateurs peuvent visualiser, et lergonomie, en prsentant les donnes sous une forme familire, indpendamment de la structure interne de la base. Une vue peut tre manipule exactement comme une table : lorsquon modifie une vue, on modifie en fait les tables sur lesquelles elle sappuie. Inversement, si on modifie les tables, les modifications sont reportes automatiquement dans toutes les vues qui leur font rfrence. La suppression dune vue ninflue pas sur le contenu de la table associe. Par contre la suppression dune table supprime toutes les vues qui lui font rfrence.
Fonction CREATE VIEW
CREATE VIEW vuetitres AS SELECT titre, type, prix, datepub FROM titres Ou avec les colonnes explicites CREATE VIEW vueEtiquette (TitreOuvrage, PrixOuvrage) AS SELECT titre, prix FROM titres
Limitations :
Base de donnes : SQL page 46
Vous pouvez crer des vues uniquement dans la base de donnes courante. Vous pouvez construire des vues partir d'autres vues ou de procdures qui font rfrence des vues. Si vous remplissez une vue par une instruction SELECT, vous navez en gnral pas besoin de donner les noms des colonnes, qui seront ceux du SELECT, sauf dans les cas suivants : - colonnes drives d'une expression arithmtique, d'une fonction ou d'une constante. - plusieurs colonnes issues de tables diffrentes auraient le mme nom. - on veut donner un nom la colonne de la vue, diffrent du nom de la colonne dans la table (prsentation pour lutilisateur de la base de donnes) Vous ne pouvez pas associer des rgles, des valeurs par dfaut ou des Dclencheurs des vues, ni construire des Index partir de vues. Vous ne pouvez pas crer de vues temporaires et vous ne pouvez pas crer de vues partir de tables temporaires. Vous ne pouvez pas modifier par UPDATE, INSERT ou DELETE les vues qui drivent de plusieurs tables par jointure, ou qui contiennent les clauses GROUP BY, ou DISTINCT, ou qui omettent un attribut obligatoire de la table (dclar NOT NULL) : ces vues ne seront accessibles quen lecture. Pour une table modifiable, la clause WITH CHECK OPTION contrle les modifications sur la vue.
Exercice 24 cration dune vue Depart
On veut disposer dune vue qui visualise les dparts du jour, partir de Paris, avec la prsentation ci-dessous :
NumVol De A Heure de Dpart Heure d'arrive
IT101 ORL BLA 11H15 12H40 IT102 CDG NIC 12H31 14H00 IT110 ORL NIC 15H24 16H00
Remarques :
- La table AEROPORT donne la liste des aroports desservant chaque ville : ORLY (ORL) et Charles de Gaulle (CDG) pour la ville de Paris. La table AFFECTATION donne les dates de tous les vols.
- Utiliser la fonction DATENAME() de Transact SQL pour extraire lheure et les minutes des colonnes VOL.Hdpart et VOL.HArrive, qui sont stockes en smalldatetime : DATENAME (hh, Hdpart) renvoie lheure du dpart, DATENAME (mi, Hdpart) renvoie les minutes
- On obtient la date du jour par la fonction GETDATE(). Cette date ne peut pas tre compare directement AFFECTATION.DateVol, car elle comprend les heures, minutes, secondes. Le plus simple est de comparer le quantime du jour de la date courante, au quantime de la date du vol : la fonction DATENAME (dayofyear, uneDate) extrait le quantime du jour de la date uneDate
Tester la vue par un select simple. Rajouter la cration de la vue dans le script de cration de la base, et sa suppression dans le script de suppression. Base de donnes : SQL page 47
3.5 Dfinition des permissions sur les objets dune base de donne
Contrle daccs aux donnes dans un SGBD
L'accs aux donnes est contrl par le SGBD au moyen de l'identification de l'utilisateur qui lors de la connexion doit fournir le nom d'utilisateur et le mot de passe associ. Chaque objet dune base de donnes mmorise la liste des utilisateurs autoriss le manipuler : son crateur et les autres utilisateurs qui auront t habilits par lui. Ladministrateur systme de SQL SERVER (compte sa) est le seul possder tous les droits sur toutes les bases de donnes : cration dune nouvelle base, suppression Ces droits ne peuvent pas lui tre retirs (indpendants des droits explicites sur la base) Le propritaire dune base de donnes (DBO : Data Base Owner) a tous les droits sur les objets de sa base, et peut les donner dautres utilisateurs par la commande GRANT ou leur retirer des droits par la commande REVOKE
Attribution de droits : GRANT SQL2 : p. 171-173
La requte GRANT permet de donner un utilisateur ou un groupe dutilisateurs la permission dutiliser certaines instructions de cration ou de suppression dobjet (CREATE TABLE, CREATE VIEW, DROP TABLE, DROP VIEW) ou des droits daccs sur des objets donns par SELECT, INSERT, UPDATE, DELETE, ALTER, ou ALL . Pour autoriser l'accs un objet pour tous les utilisateurs on utilisera le groupe PUBLIC Permissions d'instruction : GRANT {ALL |liste_d'instructions} TO {PUBLIC | liste_de_noms}
GRANT CREATE DATABASE, CREATE TABLE TO Marie, Jean
Il faut dabord accorder des permissions gnrales au groupe public, puis prciser en accordant ou en retirant des permissions spcifiques certains utilisateurs : GRANT SELECT ON auteurs TO public go
-- Marie , Jean et Pierre auront tous les privilges sur la table auteurs GRANT INSERT, UPDATE, DELETE ON auteurs TO Marie, Jean, Pierre Base de donnes : SQL page 48
Suppression de droits : REVOKE Doc. en ligne : chercher REVOKE (T-SQL)
Exercice 25 : dfinition des permissions sur les tables et les vues
Dans chaque groupe de quatre, un des comptes reprsentera lusager de base qui consulte les horaires, les deux autres seront des employs de laroport dots de permissions limites, qui assistent le propritaire de la base : un responsable des horaires et un responsable de la planification
Sous le compte du propritaire de la base (DBO) qui a tous les droits sur la base :
- Crer les trois nouveaux utilisateurs dans votre base ( usager, Responsable_horaires, Responsable_planification), correspondant aux trois comptes daccs de votre groupe, avec la syntaxe :
- Pour lusager, permettre la lecture de la vue Depart, pour consultation dans laroport. Aucun droit sur les tables !
- Le responsable des horaires a tous les droits sur Vol, et peut consulter Avion, Aeroport et Type
- Le responsable planification a le droit de lire, modifier, ajouter et supprimer sur la table Affectation, et de lire les tables Avion, Vol, Pilote, et Type
- Les deux assistants peuvent crer des vues .
En se loggant sous les trois comptes, faire des requtes manuelles, pour vrifier que les permissions fonctionnent comme prvu.
Rajouter la cration des nouveaux utilisateurs et la dfinition des permissions la fin du script de cration de la base, et la suppression des utilisateurs dans le script de suppression.
Base de donnes : SQL page 49
Avec Enterprise Manager Permission dinstruction : En vous loggant avec le compte propritaire de la base (dbo), vous pouvez visualiser et modifier les permissions dinstruction (CREATE TABLE, CREATE VIEW) des diffrents utilisateurs de votre base : slectionnez le nom de votre base, et choisissez Proprits au bouton droit de la souris.
Vous pouvez aussi visualiser et modifier les permissions dobjet sur les tables (SELECT, INSERT, UPDATE, DELETE) : double-clickez sur une table pour visualiser la fentre Proprits de table , puis clickez sur le bouton Autorisations
Base de donnes : SQL page 50
3.6 Les procdures stockes
Utilit des procdures stockes
Une procdure stocke est un ensemble d'instructions compiles, qui peut s'excuter plus rapidement. Les procdures stockes augmentent la puissance et la performance du langage SQL. Elles peuvent : recevoir et renvoyer des paramtres une procdure appelante, - appeler d'autres procdures, - renvoyer une valeur de sortie la procdure appelante
Les procdures stockes sur d'autres serveurs SQL auxquels le processus client n'est pas directement connect peuvent tre excutes si le serveur distant autorise les accs distants. Les procdures stockes diffrent des autres instructions et lots d'instructions SQL parce qu'elles sont pranalyses et prnormalises. Lorsque vous excutez une procdure pour la premire fois, le programme de traitement des requtes de SQL Server l'analyse et prpare une structure interne normalise pour la procdure qui est stocke dans une table systme. Lors de la premire excution de la procdure au dmarrage du serveur SQL, elle est charge en mmoire et compile compltement (elle n'est plus analyse ou mise en ordre puisque cela a t fait lors de sa cration). Le plan compil reste alors en mmoire (sauf si le besoin de mmoire l'oblige en sortir ) pour que sa prochaine excution (effectue par le mme client ou par un autre) puisse tre traite sans que le plan de compilation consomme des ressources systme. Les procdures stockes peuvent servir de mcanismes de scurit, car un utilisateur peut avoir la permission d'excuter une procdure stocke mme s'il n'a aucune permission sur les tables ou les vues auxquelles elle fait rfrence
Cration de procdures stockes : CREATE PROCEDURE. Doc. en ligne : Crer et maintenir des bases de donnes : Procdures Stockes Aide Transact-SQL : CREATE PROCEDURE et EXECUTE SQL2 : p.114
Les procdures stockes sont des objets de base de donnes : la permission d'excuter CREATE PROCEDURE revient par dfaut au propritaire de base de donnes qui peut la transmettre d'autres utilisateurs. Vous ne pouvez crer une procdure stocke que dans la base de donnes courante. Une procdure stocke peut contenir toutes les instructions SQL, sauf CREATE. Elle peut appeler une autre procdure stocke jusqu 16 niveaux dimbrications.
Base de donnes : SQL page 51
Pour crer une procdure stocke Dans Enterprise Manager, dans votre base de donnes, choisissez l'option Procdures stockes, et ensuite Nouvelle Procdure Stocke avec le bouton droit de la souris. Ou Utilisez l'instruction SQL CREATE PROC :
la procdure stocke info_auteur reoit en paramtres le nom et le prnom d'un auteur, et affiche le titre et l'diteur de chacun des livres de cet auteur : CREATE PROC info_auteur @nom varchar(40), @prnom varchar(20) AS SELECT nom_auteur, pn_auteur, titre, nom_diteur FROM auteurs, titres, diteurs, titreauteur WHERE pn_auteur = @prnom AND nom_auteur = @nom AND auteurs.id_auteur = titreauteur.id_auteur AND titres.id_titre = titreauteur.id_titre AND titres.id_diteur = diteurs.id_diteur go
Pour excuter la procdure : Execute info_auteur Chevalier, Bernard
nom_auteur pn_auteur titre nom_diteur ------------------------------------------------------------------------------- ---------------------------------------- Chevalier Bernard La colre : notre ennemie ? New Moon Books Chevalier Bernard Vivre sans crainte New Moon Books
la procdure info_diteur2 affiche le nom des auteurs qui ont crit un livre publi par l'diteur pass en paramtre : si aucun nom d'diteur n'est prcis, la procdure fournit les auteurs publis par Algodata Infosystems. CREATE PROC info_diteur2 @nom_diteur varchar(40) = 'Algodata Infosystems' AS SELECT nom_auteur, pn_auteur, nom_diteur FROM auteurs a, diteurs e, titres t, titreauteur ta WHERE @nom_diteur = e.nom_diteur AND a.id_auteur = ta.id_auteur AND t.id_titre = ta.id_titre AND t.id_diteur = e.id_diteur
Si la valeur par dfaut est une chane de caractres contenant des espaces ou des marques de ponctuation, ou si elle dbute par un nombre (par exemple, 6xxx), elle doit figurer entre guillemets anglais simples. La procdure peut spcifier les actions accomplir si l'utilisateur ne fournit pas de paramtre : CREATE PROC montre_index3 @table varchar(30) = NULL AS IF @table is NULL PRINT 'Entrez un nom de table' ELSE -- traitement du paramtre
@ avant le nom du paramtre Paramtre par dfaut Base de donnes : SQL page 52
Loption OUTPUT derrire un paramtre, indique un paramtre en sortie, qui est renvoy la procdure appelante : somme_titres est cre avec un paramtre d'entre facultatif titre_slectionn et un paramtre de retour somme
CREATE PROC somme_titres @titre_slectionn varchar(40) = '%', @somme money OUTPUT AS SELECT 'Liste des Titres ' = titre FROM titres WHERE titre LIKE @titre_slectionn
SELECT @somme = SUM(prix) FROM titres WHERE titre LIKE @titre_slectionn go
Appel dune procdure stocke avec un paramtre en sortie :
DECLARE @cot_total money
EXECUTE somme_titres 'Les%', @cot_total OUTPUT
IF @cot_total < 1000 BEGIN PRINT ' ' PRINT 'L''ensemble de ces titres peut s''acheter pour moins de 1 000 FF.' END ELSE SELECT 'Le cot total de ces livres s''lve ' + convert (varchar(20), @cot_total) go
Liste des Titres ----------------------------------------------- Les festins de Parly 2 Les micro-ondes par gourmandise Les secrets de la Silicon Valley
L'ensemble de ces livres peut s'acheter pour moins de 1 000 FF.
Dans une procdure stocke, vous pouvez aussi retourner une valeur par linstruction RETURN, et la rcuprer dans lappelant par la syntaxe suivante : DECLARE @cot_total money EXECUTE @cot_total = somme_titre 'Les%' Dclaration de variable Appel procdure Base de donnes : SQL page 53
Exercice 26 : cration et test de procdures stockes Crer une procdure stocke Planning_perso qui affiche, pour un nom et un prnom de pilote passs en paramtre, les numros de vol, avec les aroports de dpart et darrive, classs par date et heure de dpart.
**** Planning personnel de LECU Rgis
NumVOL De Vers partant le ------------------------------------------- IT105 LYS ORL 6 avril 6:0 IT102 CDG NIC 6 avril 12:0 IT108 BRI ORL 6 avril 19:0 IT103 GRE BLA 7 avril 9:0 IT107 NIC BRI 6 mai 7:0 IT107 NIC BRI 7 juin 7:0
Si lun des paramtres est omis, la procdure affichera le message derreur : Erreur : manque le nom du pilote , ou Erreur : manque le prnom du pilote . Si le pilote nexiste pas, la procdure affichera Erreur : pilote inexistant . Tester la procdure, et rajouter la au script de cration de la base.
Exercice 27 : procdures imbriques avec passage de paramtres, et valeur de retour
1) Faire un SELECT qui affiche la somme des heures de vol dun pilote donn, pour un numro de semaine donn, avec la prsentation suivante : ---------------------------------------------------------------------------- Semaine 49, Heures de Vols de LECU Rgis = 3
On utilisera la fonction DATEDIFF pour calculer la diffrence entre lheure de dpart et darrive, et DATENAME avec loption week pour extraire le numro de semaine de la date du vol.
2) Ranger le nom et le prnom du pilote, et le numro de semaine dans des variables intermdiaires Transact SQL. Stocker la somme des heures de vol dans une variable de type INT, et prparer le texte afficher dans une variable de type VARCHAR.
Pour formater le texte afficher, on aura besoin de la fonction CONVERT (Ressources : exemple prcdent et aides sur Convert, et Print dans Transact SQL)
3) En partant du SELECT prcdent, faire une procdure Horaire qui renvoie la somme des heures de vol dun pilote quelconque pour une semaine donne, et tester la en affichant son rsultat. Une procdure stocke doit tre une bote noire : ne pas afficher de messages derreurs mais retourner un code derreur lappelant : 0 si succs, -1 si pilote inexistant. Le nom, le prnom du pilote et le numro de semaine seront dfinis comme paramtres obligatoires.
4) Raliser une procdure ObjectifHebdomadaire qui - affiche le numro de semaine demande, le nom et le prnom du pilote, et son nombre dheures hebdomadaire (renvoy par Horaire) - compare cette somme un objectif pass en paramtre : nombre dheures demandes - affiche Objectif atteint ou non atteint
Ajouter Horaire et ObjectifHebdomadaire, aux scripts de cration et de suppression Base de donnes : SQL page 54
3.7 Les dclencheurs (trigger)
Doc. en ligne : Crer et maintenir des bases de donnes : Respect des rgles dentreprise laide de dclencheurs Aide Transact SQL : CREATE TRIGGER SQL2 : p. 107 111
Dfinition
Un dclencheur (trigger) est un type particulier de procdure stocke qui sexcute automatiquement lorsque vous modifiez ou supprimez des donnes dans une table. Les trigger garantissent la cohrence des donnes lies logiquement dans diffrentes tables : par exemple, un trigger permettra de mettre jour toutes les lignes de la table AFFECTATION, lies lavion que lon va supprimer dans la table AVION. Chaque trigger est spcifique certaines oprations sur les donnes : UPDATE, INSERT ou DELETE. Il s'excute immdiatement aprs lopration qui la lanc : le trigger et l'opration forment une seule transaction qui peut tre annule par le trigger. Si une erreur grave est dtecte, toute la transaction est automatiquement annule (en langage de bases de donnes, une transaction dsigne une suite indivisible dinstructions SQL, qui seffectuent toutes ou pas du tout ; cette notion sera dtaille dans les chapitres suivants)
Exemples dutilisation : Pour effectuer des changements en cascade dans des tables lies de la base de donnes : un dclencheur DELETE sur titres.id_titre provoque une suppression des lignes correspondant ce titre dans les tables titreauteur, ventes et droits_prvus. Pour assurer des restrictions plus complexes que par la contrainte CHECK : contrairement CHECK, les dclencheurs peuvent faire rfrence des colonnes dans d'autres tables. Pour trouver la diffrence entre l'tat d'une table avant et aprs une modification des donnes, et accomplir une ou plusieurs actions en fonction de cette diffrence.
Syntaxe du CREATE TRIGGER
Un dclencheur est un objet de base de donnes. Pour crer un dclencheur, vous devez spcifier la table courante et les instructions de modification des donnes qui l'activent. Ensuite, vous devez spcifier la ou les actions que le dclencheur devra entreprendre. Une table peut avoir au maximum trois dclencheurs: un dclencheur UPDATE, un dclencheur INSERT et un dclencheur DELETE. Chaque dclencheur peut avoir de nombreuses fonctions et appeler jusqu' 16 procdures. Un dclencheur ne peut tre associ qu' une seule table, mais il peut s'appliquer aux trois oprations de modifications de donnes (UPDATE, INSERT et DELETE). Base de donnes : SQL page 55
Exemple 1 :
CREATE TRIGGER pense_bte
ON titres
FOR INSERT, UPDATE
AS RAISERROR ('Insertion Livres',15,9)
go
Ce trigger envoie un message au client lorsquon ajoute ou on modifie des donnes dans titres. Linstruction SQL :
provoque le dclenchement du trigger, avec le message :
insert titres (id_titre, titre) values ('BX100', 'test') Msg. 50000, niveau 15, tat 9 Insertion Livres
Exemple 2 : ce dclencheur INSERT met jour la colonne cumulannuel_ventes de la table titres chaque fois qu'une nouvelle ligne est ajoute la table ventes. CREATE TRIGGER dclench_ins ON ventes FOR INSERT AS UPDATE titres SET cumulannuel_ventes = cumulannuel_ventes + qt FROM inserted
WHERE titres.id_titre = inserted.id_titre Go
-- Affichage du cumul de ventes par livres, avant la nouvelle vente SELECT id_titre, cumulannuel_ventes FROM titres WHERE cumulannuel_ventes is NOT NULL
id_titre cumulannuel_ventes -------- ------------------ BU1032 15 MC3021 40 PS2091 30 Nom de la table Conditions de dclenchement Actions associes Table temporaire = lignes modifies de VENTES Base de donnes : SQL page 56
-- Insertion dune nouvelle vente : qt = 100 sur le livre 'BU1032' INSERT ventes VALUES ('6380', '6700', '1994', 100, 'Net 60', 'BU1032' )
-- Provoque la mise jour automatique de la table TITRES par le trigger, et donc aussi le dclenchement du trigger davertissement prcdent : Msg. 50000, niveau 15, tat 9 Insertion Livres
--Raffichage du cumul de ventes par livres, aprs la vente id_titre cumulannuel_ventes -------- ------------------ BU1032 115 MC3021 40 PS2091 30
Avec Enterprise Manager Pour visualiser et mettre jour un Trigger : dans la fentre de modification de la Table concerne, cliquez sur le bouton Dclencheurs , dans la barre doutils
Base de donnes : SQL page 57
Exercice 28 : scurisation des suppressions, avec modification en cascade
Dans la table PILOTE, crer un trigger en suppression, qui met NULL tous les champs IdPilote de la table AFFECTATION, lis au pilote supprimer : avec cette mthode, on connat les vols sans affectation, qui devront tre affects un autre pilote. Tester le trigger en supprimant un pilote, et en raffichant la table AFFECTATION.
Les lignes supprimer sont stockes dans la table temporaire deleted. Pour cet exercice, il faut supprimer la contrainte de cl trangre sur la colonne IdPilote de la table AFFECTATION : comme les contraintes de cl trangre sont values avant le lancement des triggers, le lien entre AFFECTATION et PILOTE interdit la suppression des pilotes rfrencs dans la table AFFECTATION
Exercice 29 : test de cohrence en insertion sur la table VOL Dans la table VOL, crer un trigger en insertion qui vrifie que la ville darrive est diffrente de la ville de dpart, et que lheure darrive est postrieure lheure de dpart. Dans le cas contraire, on annule linsertion en appelant linstruction ROLLBACK.
Exercice 29 bis : test de cohrence en insertion sur la table AFFECTATION Interdire un pilote de voler plus de 35 heures par semaine, par un Trigger en insertion sur la table AFFECTATION.
Lors de laffectation dun pilote un vol, on vrifie que la somme des heures de vol hebdomadaire de ce pilote, pour la semaine considre, ne dpasse pas 35 heures
La somme des heures de vol du pilote pour une semaine reprsente par son numro, est donne par la procdure Horaire. Cette procdure ne prend pas en compte la nouvelle affectation, qui nest pas encore dans la table AFFECTATION, mais dans la table provisoire Inserted
Base de donnes : SQL page 58
3.8 Les index
Doc. en ligne : Crer et maintenir des bases de donnes : Index Doc. en ligne : Optimiser la performance des bases de donne Aide Transact SQL : CREATE INDEX
Prsentation simplifie et conseils
Les index permettent doptimiser le fonctionnement dune base de donnes : ils acclrent les oprations SELECT, INSERT, UPDATE et DELETE en fournissant un accs direct sur certaines colonnes ou ensembles de colonnes. Un index ordonn (option CLUSTERED) fournit un accs direct aux lignes physiques de la table, sur le disque. La cration dun index ordonn modifie l'ordre physique des lignes : il faut donc le crer avant les index non ordonns, et il ne peut y avoir quun index ordonn par table (souvent sur la cl primaire). Un index non ordonn (sans loption CLUSTERED) est un index qui sappuie sur l'ordre logique de la table, en mmoire. Une table peut contenir plusieurs index non ordonns. Employez un index non ordonn pour : - des colonnes qui contiennent un nombre lev de valeurs uniques; - des requtes qui renvoient de petits ensembles de rsultats
La recherche de donnes au moyen d'un index ordonn est presque toujours plus rapide quavec un index non ordonn. L'index ordonn est particulirement utile lorsque lon veut extraire en une seule instruction plusieurs lignes qui possdent des cls contigus : lindex garantit que ces lignes seront physiquement adjacentes. Pour crire un index efficace, il faut visualiser la slectivit des colonnes = le nombre de valeurs uniques par rapport au nombre de lignes de la table, donnes par linstruction SQL : SELECT COUNT (DISTINCT nom_de_colonne) FROM nom_de_table
Conseils pour une table de 10 000 lignes: Nombre de valeurs uniques Choix de lindex 5000 Index non ordonn 20 Index ordonn 3 Pas d'index
Index simple : sur la colonne id_d'auteur de la table auteurs. CREATE INDEX index_id_auteur ON auteurs (id_auteur)
Index ordonn unique : sur la colonne id_d'auteur de la table auteurs pour assurer l'unicit des donnes. L'option CLUSTERED tant spcifie, cet index classera physiquement les donnes sur le disque. Base de donnes : SQL page 59
CREATE UNIQUE CLUSTERED INDEX index_id_auteur ON auteurs (id_auteur)
Index compos simple : cre un index sur les colonnes id_d'auteur et id_titre de la table titreauteur. CREATE INDEX ind1 ON titreauteur (id_auteur, id_titre)
Exercice 30 : optimisation de la base Compagnie arienne
Crer un Index non ordonn compos sur les champ NomPilote et PrenomPilote de la table Pilote.
Vrifier lexistence de lindex sous Microsoft SQL Enterprise : slectionner la table, puis avec le bouton droit Modifier une table , puis cliquer dans la barre doutil sur le bouton Proprits de table et dindex :
Base de donnes : SQL page 60
3.9 Rcapitulation
Reprendre tous les exercices et complter le script de cration de la base, dans lordre : - dfinition des types utilisateurs - cration des tables, en commenant par les tables indpendantes - cration des vues - cration des procdures stockes - dfinition des permissions sur les tables, les vues, les procdures stockes - cration des triggers - cration des index
Ecrire un script dinitialisation complte des tables (INSERT)
Ecrire un script de destruction complte de la base, dans lordre inverse de la cration : - suppression des index, triggers, procdures stockes - suppression des vues - suppression des tables, en commenant par les tables avec des cls trangres - suppression des types utilisateurs
Avec SQL Enterprise Manager
Conservez votre base et crez en une autre vide, que vous allez grer entirement sous Enterprise Manager
- Types de donnes utilisateur : bouton droit => Nouveau type de donnes dfini par lutilisateur
- Tables : slectionnez lobjet Tables : bouton droit => Nouvelle Table Lutilisation est assez intuitive : pour dfinir les contraintes de cl primaire => cliquez sur la cl jaune dans la barre doutil (comme sous ACCESS)
- Vues : slectionnez lobjet Vues : bouton droit => Nouvelle Vue . Vous pouvez dfinir votre Vue en langage SQL, ou avec un outil graphique comparable celui dACCESS et de VISUAL BASIC. Base de donnes : SQL page 61
- Procdures stockes : slectionnez lobjet Procdures Stockes : bouton droit => Nouvelle Procdure Stocke . Pas daide graphique : il faut lcrire en SQL dans la fentre !
- Triggers : slectionnez une une les tables concernes : bouton droit Modifier une table , puis bouton Dclencheurs dans la barre doutil de la fentre Crer la table
Demander une cration automatique de scripts de cration et de destruction , et comparez les scripts gnrs aux scripts que vous venez dcrire
Slectionner votre base : avec le bouton droit, choisir Toutes Tches , Gnrer des scripts SQL
Base de donnes : SQL page 62
A titre dexemple : lire le script de cration de la base PUBLI utilis au dbut de ce cours (Extrait)
Faire des recherches documentaires sur les syntaxes qui nont pas t vues dans la construction guide. Ce script peut aussi vous servir dexemples pour la plupart des syntaxes.
-- - InstPubli.SQL 2001
GO set nocount on set dateformat mdy
USE master GO declare @dttm varchar(55) select @dttm=convert(varchar,getdate(),113) raiserror('Dbut de InstPubli.SQL %s ....',1,1,@dttm) with nowait if exists (select * from sysdatabases where name='publi') DROP database publi GO
CHECKPOINT GO CREATE DATABASE publi on master = 3 GO CHECKPOINT GO USE publi GO if db_name() = 'publi' raiserror('Base de donnes ''publi'' cre et contexte actuellement utilis.',1,1) else raiserror('Erreur dans InstPubli.SQL, ''USE publi'' a chou! Arrt immdiat du SPID.' ,22,127) with log go
execute sp_dboption 'publi' ,'trunc. log on chkpt.' ,'true'
raiserror('Etape de cration de la section de table ....',1,1) GO
CREATE TABLE auteurs ( id_auteur id CHECK (id_auteur like '[0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]') CONSTRAINT UPKCL_auidind PRIMARY KEY CLUSTERED, nom_auteur varchar(40) NOT NULL, pn_auteur varchar(20) NOT NULL, tlphone char(12) NOT NULL DEFAULT ('INCONNU'), adresse varchar(40) NULL, ville varchar(20) NULL, pays char(2) NULL, code_postal char(5) NULL CHECK (code_postal like '[0-9][0-9][0-9][0-9][0-9]'), contrat bit NOT NULL ) go
Base de donnes : SQL page 63
CREATE TABLE diteurs ( id_diteur char(4) NOT NULL CONSTRAINT UPKCL_pubind PRIMARY KEY CLUSTERED CHECK (id_diteur in ('1389', '0736', '0877', '1622', '1756') OR id_diteur like '99[0-9][0-9]'), nom_diteur varchar(40) NULL, ville varchar(20) NULL, rgion char(2) NULL, pays varchar(30) NULL DEFAULT('FR') ) go
CREATE TABLE titres ( id_titre idt CONSTRAINT UPKCL_titleidind PRIMARY KEY CLUSTERED, titre varchar(80) NOT NULL, type char(12) NOT NULL DEFAULT ('SANS TITRE'), id_diteur char(4) NULL REFERENCES diteurs(id_diteur), prix money NULL, avance money NULL, droits int NULL, cumulannuel_ventes int NULL, notes varchar(200) NULL, datepub datetime NOT NULL DEFAULT (getdate()) ) go
CREATE TABLE titreauteur ( id_auteur id REFERENCES auteurs(id_auteur), id_titre idt REFERENCES titres(id_titre), cmd_auteur tinyint NULL, droits_pourcent int NULL, CONSTRAINT UPKCL_taind PRIMARY KEY CLUSTERED(id_auteur, id_titre) ) go
CREATE TABLE magasins ( id_mag char(4) NOT NULL CONSTRAINT UPK_storeid PRIMARY KEY CLUSTERED, nom_mag varchar(40) NULL, adresse_mag varchar(40) NULL, ville varchar(20) NULL, pays char(2) NULL, code_postal char(5) NULL ) go
CREATE TABLE ventes ( id_mag char(4) NOT NULL REFERENCES magasins(id_mag), num_cmd varchar(20) NOT NULL, date_cmd datetime NOT NULL, qt smallint NOT NULL, modepaiements varchar(12) NOT NULL, id_titre idt REFERENCES titres(id_titre), CONSTRAINT UPKCL_sales PRIMARY KEY CLUSTERED (id_mag, num_cmd, id_titre) ) Base de donnes : SQL page 64
go
CREATE TABLE droits_prvus ( id_titre idt REFERENCES titres(id_titre), minimum int NULL, maximum int NULL, droits int NULL ) go
CREATE TABLE remises ( typeremise varchar(40) NOT NULL, id_mag char(4) NULL REFERENCES magasins(id_mag), qtmin smallint NULL, qtmax smallint NULL, remise dec(4,2) NOT NULL ) go
CREATE TABLE emplois ( id_emploi smallint IDENTITY(1,1) PRIMARY KEY CLUSTERED, desc_emploi varchar(50) NOT NULL DEFAULT 'Nouveau poste - pas de dnomination officielle', niv_min tinyint NOT NULL CHECK (niv_min >= 10), niv_max tinyint NOT NULL CHECK (niv_max <= 250) ) go
CREATE TABLE pub_info ( pub_id char(4) NOT NULL REFERENCES diteurs(id_diteur) CONSTRAINT UPKCL_pubinfo PRIMARY KEY CLUSTERED, logo image NULL, pr_info text NULL ) go
Base de donnes : SQL page 65
CREATE TABLE employ ( id_employ empid CONSTRAINT PK_id_employ PRIMARY KEY NONCLUSTERED CONSTRAINT CK_id_employ CHECK (id_employ LIKE '[A-Z][A-Z][A-Z][1-9][0-9][0-9][0-9][0-9][FM]' or id_employ LIKE '[A-Z]-[A-Z][1-9][0-9][0-9][0-9][0-9][FM]'),
pn_employ varchar(20) NOT NULL, init_centrale char(1) NULL, nom_employ varchar(30) NOT NULL, id_emploi smallint NOT NULL DEFAULT 1
id_diteur char(4) NOT NULL DEFAULT ('9952') REFERENCES diteurs(id_diteur),
date_embauche datetime NOT NULL DEFAULT (getdate()) ) go
raiserror('Etape de cration de la section de trigger ....',1,1) GO
CREATE TRIGGER employ_insupd ON employ FOR INSERT, UPDATE AS --Get the range of level for this job type from the jobs table. DECLARE @niv_min tinyint, @niv_max tinyint, @niv_emploi tinyint, @id_emploi smallint SELECT @niv_min = niv_min, @niv_max = niv_max, @niv_emploi = i.position_employ, @id_emploi = i.id_emploi FROM employ e, emplois j, inserted i WHERE e.id_employ = i.id_employ AND i.id_emploi = j.id_emploi IF (@id_emploi = 1) and (@niv_emploi <> 10) BEGIN RAISERROR ('L''identificateur d''emploi 1 attend le niveau par dfaut 10.',16,-1) ROLLBACK TRANSACTION END ELSE IF NOT (@niv_emploi BETWEEN @niv_min AND @niv_max) BEGIN RAISERROR ('Le niveau de id_emploi:%d doit se situer entre %d et %d.', 16, -1, @id_emploi, @niv_min, @niv_max) ROLLBACK TRANSACTION END go
raiserror('Etape d''insertion des auteurs ....',1,1) GO
INSERT auteurs VALUES('807-91-6654','Bec','Arthur','22.47.87.11','4, chemin de la Tour de Campel', 'Bruges','BE','05006',1) go
raiserror('Etape d''insertion des diteurs ....',1,1)
GO INSERT diteurs VALUES('9901', 'GGG&G', 'Munich', NULL, 'GER') Base de donnes : SQL page 66
INSERT diteurs VALUES('9999', 'Editions Lucerne', 'Paris', NULL, 'FR') go
raiserror('Etape d''insertion des pub_info ....',1,1)
GO INSERT pub_info VALUES('9901', 0xFFFFFFFF, 'Aucune information actuellement') INSERT pub_info VALUES('9999', 0xFFFFFFFF, 'Aucune information actuellement') go
raiserror('Etape d''insertion des titres ....',1,1)
GO INSERT titres VALUES('PC8888',"Les secrets de la Silicon Valley",'informatique','1389',$136.00,$54000.00,10,4095,"Deux femmes courageuses dvoilent tous les scandales qui jonchent l'irrsistible ascension des pionniers de l'informatique. Matriel et logiciel : personne n'est pargn.",'12/06/85' ) go raiserror('Etape d''insertion de titreauteur ....',1,1)
GO INSERT titreauteur VALUES('172-32-1176', 'PS3333', 1, 100) INSERT titreauteur VALUES('213-46-8915', 'BU1032', 2, 40) go
raiserror('Etape d''insertion des magasins ....',1,1)
GO INSERT magasins VALUES('7066','Librairie spcialise','567, Av. de la Victoire','Paris','FR','75016') go
raiserror('Etape d''insertion des ventes ....',1,1)
GO INSERT ventes VALUES('7066', 'QA7442.3', '11/09/94', 75, 'Comptant','PS2091') go
raiserror('Etape d''insertion de droits_prvus ....',1,1)
GO INSERT droits_prvus VALUES('BU2075', 1001, 3000, 12) INSERT droits_prvus VALUES('BU2075', 3001, 5000, 14) go
raiserror('Etape d''insertion des remises ....',1,1)
GO INSERT remises VALUES('Remise volume', NULL, 100, 1000, 6.7) INSERT remises VALUES('Remise client', '8042', NULL, NULL, 5.0) go
raiserror('Etape d''insertion des emplois ....',1,1)
GO INSERT emplois VALUES ('Directeur des oprations', 75, 150) INSERT emplois VALUES ('Rdacteur', 25, 100) go
raiserror('Etape d''insertion des employ ....',1,1)
GO INSERT employ VALUES ('M-P91209M', 'Manuel', '', 'Pereira', 8, 101, '9999', '09/01/89') go
raiserror('Etape de cration de la section d''index ....',1,1) with nowait
GO CREATE CLUSTERED INDEX employ_ind ON employ(nom_employ, pn_employ, init_centrale) go
CREATE NONCLUSTERED INDEX aunmind ON auteurs (nom_auteur, pn_auteur) Base de donnes : SQL page 67
go CREATE NONCLUSTERED INDEX titleidind ON ventes (id_titre) go CREATE NONCLUSTERED INDEX titleind ON titres (titre) go CREATE NONCLUSTERED INDEX auidind ON titreauteur (id_auteur) go CREATE NONCLUSTERED INDEX titleidind ON titreauteur (id_titre) go CREATE NONCLUSTERED INDEX titleidind ON droits_prvus (id_titre) go
raiserror('Etape de cration de la section d''view ....',1,1) with nowait GO
CREATE VIEW vuetitre AS SELECT titre, cmd_auteur, nom_auteur, prix, cumulannuel_ventes, id_diteur FROM auteurs, titres, titreauteur WHERE auteurs.id_auteur = titreauteur.id_auteur AND titres.id_titre = titreauteur.id_titre go
raiserror('Etape de cration de la section de procedure ....',1,1) with nowait
GO
CREATE PROCEDURE pardroits @pourcentage int AS SELECT id_auteur FROM titreauteur WHERE titreauteur.droits_pourcent = @pourcentage go
raiserror('(Ensuite, premier octroi incorpor dans la section de proc.)',1,1)
GRANT EXECUTE ON pardroits TO public go
CREATE PROCEDURE reptq1 AS SELECT id_diteur, id_titre, prix, datepub FROM titres WHERE prix is NOT NULL ORDER BY id_diteur COMPUTE avg(prix) BY id_diteur COMPUTE avg(prix) go
GRANT EXECUTE ON reptq1 TO public go
CREATE PROCEDURE reptq2 AS SELECT type, id_diteur, titres.id_titre, cmd_auteur, Name = substring (nom_auteur, 1,15), cumulannuel_ventes FROM titres, auteurs, titreauteur WHERE titres.id_titre = titreauteur.id_titre AND auteurs.id_auteur = titreauteur.id_auteur AND id_diteur is NOT NULL ORDER BY id_diteur, type COMPUTE avg(cumulannuel_ventes) BY id_diteur, type COMPUTE avg(cumulannuel_ventes) BY id_diteur go
GRANT EXECUTE ON reptq2 TO public go
Base de donnes : SQL page 68
CREATE PROCEDURE reptq3 @limite_infrieure money, @limite_suprieure money, @type char(12) AS SELECT id_diteur, type, id_titre, prix FROM titres WHERE prix >@limite_infrieure AND prix <@limite_suprieure AND type = @type OR type LIKE '%cui%' ORDER BY id_diteur, type COMPUTE count(id_titre) BY id_diteur, type go
GRANT EXECUTE ON reptq3 TO public
go GRANT CREATE PROCEDURE TO public go
raiserror('Etape de la section de GUEST ....',1,1)
GO
EXECUTE sp_adduser guest go
GRANT ALL ON diteurs TO guest idem sur toutes les tables
GRANT EXECUTE ON pardroits TO guest GRANT CREATE TABLE TO guest GRANT CREATE VIEW TO guest GRANT CREATE RULE TO guest GRANT CREATE DEFAULT TO guest GRANT CREATE PROCEDURE TO guest go
UPDATE STATISTICS diteurs idem sur toutes les tables GO CHECKPOINT go declare @dttm varchar(55) select @dttm=convert(varchar,getdate(),113) raiserror('Fin de InstPubli.SQL %s ....',1,1,@dttm) with nowait Base de donnes : SQL page 69
Exercices complmentaires sur la base "Compagnie arienne"
Pour faire cette suite dexercices, commencer par ajouter une colonne Ville la table Pilote : ville o rside le pilote. Remplir cette colonne avec un jeu de test, qui comprend certaines des villes o sont localiss des avions (corrigs en annexe)
1 Noms des pilotes qui habitent dans la ville de localisation d'un A320 (dans une ville desservie par un aroport o sont bass des A320)
2 Noms des pilotes planifis pour des vols sur A320
3 Noms des pilotes planifis sur A320, qui habitent dans la ville de localisation d'un A320
4 Noms des pilotes planifis sur A320, qui nhabitent pas la ville de localisation d'un A320
5 Noms des pilotes planifis sur A320 ou qui habitent la ville de localisation d'un A320
6 Pour chaque ville desservie, donner la moyenne, le minimum et le maximum des capacits des avions qui sont localiss dans un aroport desservant cette ville
7 Mme question, limite aux villes o sont localiss plus de deux avions
8 Afficher les noms des pilotes qui ne pilotent que des A320
9 Afficher les noms des pilotes qui pilotent tous les A320 de la compagnie
Base de donnes : SQL page 70
4. LES TRANSACTIONS Doc. en ligne : Accder aux donnes et les modifier : Transactions SQL2 : chap. 13, La gestion des transactions
Principes
Une transaction est une unit logique de travail, un ensemble d'instructions dinterrogation ou de mise jour des donnes que SQL traite comme une seule action indivisible : soit toutes les instructions comprises dans la transaction sont traites, soit aucune. Ce mcanisme garantit la fiabilit des accs au SGBD et la cohrence des donnes : il pare toute interruption non dsire d'une squence d'instructions (arrt programme, panne machine ou volont d'annuler les dernires oprations). Une unit logique de travail doit possder quatre proprits appeles proprits ACID (Atomicit, Cohrence, Isolation et Durabilit), pour tre considre comme une transaction : - Atomicit : une transaction doit tre une unit de travail indivisible ; soit toutes les modifications de donnes sont effectues, soit aucune ne l'est.
Soit une transaction bancaire qui dbite un compte A et crdite un compte B : sans le mcanisme de transaction, si une erreur survenait entre le dbit et le crdit, la somme verse serait perdue pour tout le monde. Le mcanisme de transaction va lier les deux oprations : en cas de crash du systme central ou de coupure du rseau entre lagence bancaire et le central, les deux oprations sont annules.
- Cohrence : lorsqu'elle est termine, une transaction doit laisser les donnes dans un tat cohrent.
Cest une consquence de latomicit : si lon arrive sans erreur la fin de la transaction, les comptes dbiteur et crditeur sont actualiss par une opration indivisible ; si une erreur survient pendant la transaction, les deux oprations sont annules.Dans les deux cas, les deux soldes demeurent cohrents.
Remarquons que le mcanisme de transaction ne fait pas tout : si le problme survient immdiatement aprs la fin de la transaction, le virement a eu lieu, et il nest pas question de le faire une seconde fois ; au contraire, si lerreur survient juste avant, il faut refaire le virement.
Ce sera donc lapplication de tenir jour un journal des virements, pour savoir dans tous les cas si le virement a eu lieu ou non : pour restituer fidlement les oprations, le journal doit videmment tre actualis dans la transaction.
- Isolation : les modifications effectues par des transactions concurrentes doivent tre isoles transaction par transaction. Une transaction accde aux donnes soit dans l'tat o elles taient avant d'tre modifies par une transaction concurrente, soit telles qu'elles se prsentent aprs excution de cette dernire, mais jamais dans un tat intermdiaire.
Base de donnes : SQL page 71
Tant quune transaction nest pas finie, on ne peut pas tre sr quelle aboutisse sans erreur : un utilisateur qui consulte les deux soldes depuis un autre terminal de gestion, doit donc voir les anciens soldes = les dernires donnes dont la cohrence est garantie.
- Durabilit : Lorsqu'une transaction est termine, ses effets sur le systme sont permanents. Les modifications sont conserves mme en cas de dfaillance du systme.
Remarques : 1) Ce type de fonctionnement est possible parce que le S.G.B.D. dispose d'une copie des tables avant modification (souvent appele SNAPSHOT = ltat instantan). Lors du COMMIT, le SGBDR recopie le fichier SNAPSHOT sur le fichier de bases de donne, en une seule opration indivisible. 2) Un ROLLBACK automatique est excut en cas de panne de la machine. 3) ROLLBACK et COMMIT ne concernent pas les commandes de dfinition de donnes : CREATE, DROP, ALTER. Toute modification portant sur la structure de la base de donnes, est donc irrversible. 4) L'excution frquente d'un COMMIT peut viter la perte d'informations.
Mise en uvre en Transact SQL Selon les SGBD, le dbut d'une transaction est dclench diffremment : sous SQL SERVER, il est marqu par linstruction : BEGIN TRANSACTION La fin dune transaction est marque par les instructions COMMIT ou ROLLBACK. Les modifications ne sont rendues permanentes que lors de l'instruction COMMIT : tant que les changements ne sont pas valids par un COMMIT, seul l'utilisateur travaille sur les donnes quil vient de modifier alors que les autres utilisateurs travaillent sur les valeurs avant modification. Linstruction ROLLBACK annule toutes les modifications effectues depuis le dbut de la transaction en cours. En labsence de transaction explicite marque par BEGIN TRANSACTION, toute instruction SQL constitue une transaction lmentaire.
Exercice 31 : vrification du mcanisme ACID, observation des verrouillages
Travaillez sur votre base Compagnie Aerienne avec lanalyseur de requte : on ouvrira deux sessions par binme deux noms diffrents.
- pour que SQL SERVER gre correctement les transactions, commencer par spcifier dans les deux sessions : SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
Base de donnes : SQL page 72
- 1) Crer un nouveau pilote, en terminant la transaction par ROLLBACK. Vrifier que le nouveau pilote nest pas conserv dans la base (faire un SELECT avant et aprs le ROLLBACK)
- 2) Ouvrir une transaction par session. Faire une lecture sur la table Pilote (SELECT) dans chaque session. Que constatez-vous ?
- 3) Ouvrir une transaction par session. Dans une des sessions, on lit les donnes (SELECT sur Pilote) ; dans lautre on essaie de les changer (UPDATE sur Pilote). Que constatez-vous ?
- 5) Ouvrir une transaction par session. On commence par modifier dans une session et on lit dans lautre. Que constatez-vous ?
Pour expliquer ce qui a t observ, nous allons dtailler les deux utilisations des transactions : - dans la gestion des erreurs (utilisation du ROLLBACK) ; - dans la gestion des accs concurrents (plusieurs clients accdant aux mmes tables en lecture ou en criture, entranant un verrouillage)
Lutilisation des transactions dans la gestion derreur
TRANSACT SQL range un compte-rendu derreur, aprs chaque requte, dans la variable globale : @@error . Si linstruction sest bien effectue, @@error = 0, sinon il sagit dune erreur ou dun Warning. Pour crire une transaction correcte, il faut donc tester @@error et faire un ROLLBACK ds quune erreur est dtecte. Exercice 32 : ralisation dune procdure stocke fiable, avec transaction
On veut grer par une procdure stocke les dparts de la socit, et les raffectations des vols au pilote remplaant. La procdure doit tre fiable : un pilote ne doit tre supprim des listes de la compagnie arienne, quune fois le remplaant entr dans les listes et tous ses vols raffects. Ces trois oprations doivent tre indivisibles.
On propose linterface suivante pour la procdure stocke :
ENTREE @idAncien : identificateur de l'ancien pilote (OBLIGATOIRE) @nom : nom du nouveau pilote (OBLIGATOIRE) @prenom : prenom du nouveau pilote (OBLIGATOIRE) SORTIE @idNouveau : identificateur du nouveau pilote RETOUR (0) Remplacement OK, (1) Erreur : paramtres incorrects, (2) Erreur : l'ancien pilote , n'existe pas, (3) Erreur systme La procdure sera livre avec son programme de test Base de donnes : SQL page 73
Laccs concurrent : verrouillages dans les transactions
Un SGBD tant souvent utilis sur une machine multi-utilisateurs, ou en Client-Serveur partir de plusieurs clients, on peut imaginer ce qui arriverait si deux transactions pouvaient modifier en mme temps la mme ligne dune table ! Reprenons lexemple du dbit/crdit, en supposant que la banque ne tolre aucun dcouvert. Lapplication qui effectue le virement doit tester si le compte A est approvisionn, avant de faire le dbit. Si lon nutilise pas de transaction, on tombe sur un problme classique en programmation concurrente : deux applications veulent dbiter le mme compte ; elles commencent par tester le solde qui est suffisant pour chacune dentre elles, et dbitent ensuite la somme demande, en aboutissant un solde ngatif. Le compte dbiter a un solde initial de 1200 F Application A : Demande un dbit de 1000 F Application B : Demande un dbit de 500 F (1) Test du solde OK : 1200 > 1000 (2) Test du solde OK : 1200 > 500 (3) Dbit de 1000 F => nouveau solde = 200 F (4) Dbit de 500 F => solde final = -300 F
Ce problme fondamental de l'accs concurrentiel aux donnes est gr au moyen dun mcanisme de verrouillage, des lignes ou des tables entires (lock). Ce mcanisme permet de bloquer l'accs aux lignes ou aux tables concernes soit automatiquement (ORACLE, SQL Server), soit sur commande explicite (DB2, RDB). L'accs une ligne ou une table verrouilles peut tre trait soit par attente du dblocage (mode WAIT) soit par ROLLBACK de la transaction (mode NOWAIT) : le dblocage est effectif ds la fin de la transaction. Reprise de lexemple prcdent avec transaction et verrouillage de la table Comptes Application A : Demande un dbit de 1000 F Application B : Demande un dbit de 500 F (1) Dbut transaction avec verrouillage exclusif de la table Comptes ( passant) (2) Dbut transaction avec verrouillage exclusif de la table Comptes ( bloqu) (3) Test du solde OK : 1200 > 1000 En attente (4) Dbit de 1000 F => solde = 200 F En attente (5) Fin transaction => dverrouillage de la table Comptes (6) Test du solde : 200 < 500 => dbit refus (7) Fin transaction => dverrouillage de la table Comptes
La norme SQL2 ne prvoie pas de demande explicite des verrous en dbut de transaction : les programmeurs risquant doublier de rserver les verrous, la norme considre que la prise automatique de verrous par le SGBD est prfrable. Le SGBD choisit automatiquement les verrous poser sur les tables et les lignes en fonction des requtes reues : - SELECT : le SGBD pose un verrou partag , cest--dire un verrou qui autorise les autres lecteurs consulter la table, mais qui bloque les demandes dcriture (INSERT, DELETE, UPDATE) - INSERT, DELETE, UPDATE : le SGBD pose un verrou exclusif qui interdit tout autre opration sur lobjet, y compris les lectures
PROBLEME TRANSACTION SOLUTION
Lecture inconsistante
Lecture non rptitive
Le SGBD pose des verrous diffrents selon le niveau disolation des transactions : 1. Read Uncommited : Aucun verrou. On peut lire les mises jour dans dautres applications, mme si elles nont pas encore t valides par un COMMIT. Fortement dconseill ! 2. Read Commited (dfaut) : verrou exclusif sur les lignes modifies. Le SGBD cache les modifications en cours aux autres utilisateurs, tant quelles nont pas t valides par COMMIT. Mais il ne pose pas de verrous sur le SELECT : dans une mme transaction, les lectures ne sont pas
Verrou Exclusif Libration verrou Verrou Partag Libration verrous Verrou Exclusif Base de donnes : SQL page 75
ncessairement rptitives , les donnes pouvant tre modifies par une autre transaction entre des lectures qui se suivent. 3. Repeatable Read (conseill) : corrige le problme prcdent des lectures non rptitives, en posant un verrou partag sur les lignes lues, en plus du verrou exclusif sur les lignes modifies. Les lignes ne pourront donc pas tre modifies entre le premier SELECT et la fin de la transaction. 4. Serializable : le SGBD prend un verrou de table sur toute ressource utilise
En rsum, le SGBD manipule quatre sortes de verrous, selon les oprations et le niveau disolation demands : Verrou partag Verrou exclusif Verrou de pages (lignes) Lecture dans le cas 3 modification dans les cas 2 et 3 Verrou de tables Lecture dans le cas 4 modification dans le cas 4
Verrou de pages : en pratique, un SGBD ne pose jamais un verrou sur une seule ligne, mais sur la page qui contient cette ligne. Norme SQL 2 sur les niveaux disolation : p. 162
Mise en uvre pratique en Transact SQL
Par dfaut SQL Server travaille dans un cas proche du Read Commited : il pose des verrous exclusifs sur les pages modifies; il pose des verrous partags sur les pages lues (comme dans le cas Repeatable Read ) mais il les libre ds la fin du SELECT. Les verrous partags sont donc bloquants si une modification est en cours dans une autre transaction, mais ils nempchent pas les autres de modifier les donnes qui viennent dtre lues. Trois options pour modifier le comportement des verrous : HOLDLOCK, TABLOCK et TABLOCKX HOLDLOCK maintient le verrou jusquau COMMIT (au lieu de le relacher aprs le SELECT). Il interdit donc toute modification externe, et garantit la cohrence de toutes les lectures TABLOCK pose un verrou partag de table, au lieu dun verrou de page TABLOCKX pose un verrou exclusif de table Exemple de transaction bancaire qui garantit la cohrence du solde (abandon si solde insuffisant) et la rptitivit des diffrentes lectures (solde non modifi par une autre transaction entre deux lectures) -- fixer le mode disolation set transaction isolation level SERIALIZABLE -- dbut de la transaction begin transaction Base de donnes : SQL page 76
-- lecture de la table Compte avec verrouillage de la table en mode exclusif : criture et lecture interdites jusquau COMMIT Select solde From Comptes (HOLDLOCK TABLOCKX) Where num = 1 -- modification de la table Comptes Update Comptes Set solde = solde 500 Where num = 1 -- lecture de vrification, pour trouver le nouveau solde Select solde From Comptes Where num = 1 -- fin transaction commit transaction
Attention aux deadlocks
Lutilisation des verrous peut conduire des "deadlock" : situation o deux transactions ou plus peuvent se bloquer mutuellement.
Application A Application B begin transaction begin transaction Select solde From Comptes (HOLDLOCK) Where num = 1 verrou partag, PASSANT
Select solde From Comptes (HOLDLOCK) Where num = 1 verrou partag, PASSANT Update Comptes Set solde = solde 500 Where num = 1 Demande de verrou exclusif, BLOQUANT (sur verrou partag de B)
Update Comptes Set solde = solde 500 Where num = 1 Demande de verrou exclusif, BlOQUANT (sur verrou partag de A) => DEADLOCK e
Exercice 32 : provoquer un DEADLOCK
Lancer deux fois le script SQL fourni Deadlock.sql sous deux connexions diffrentes.
Excuter uniquement le SELECT sous chacune des connexions. Puis excuter le UPDATE sous chacune des connexions. Que se passe-t-il ? Comment le SGBD sort-il du deadlock ?
Mme exercice en observant les verrous qui sont poss par le SGBD. Sous Enterprise Manager, connectez vous sous le compte Dveloppeur qui vous donne des droits suffisants pour observer Base de donnes : SQL page 77
ltat du systme. Dans Gestion / Activit en cours , vous trouverez des informations sur les processus en cours, et les verrous poss sur les diffrents objets de la base.
Modifier le script avec loption TABLOCKX qui vite le Deadlock en bloquant le deuxime processus ds le SELECT (=> cest la solution retenir)
Base de donnes : SQL page 78
5. LE MODELE CLIENT/SERVEUR 5.1 Introduction
Le modle client-serveur consiste en un dialogue entre deux programmes, qui changent des donnes ou les rsultats dun calcul, par exemple. Les deux programmes dialoguent dans un rapport dgal gal et non dans un rapport matre-esclave comme autrefois avec les systmes centraliss. A la base du dialogue, il y a un besoin du client : le client est lapplication qui dbute la "conversation", afin d'obtenir de la part du serveur (le programme "rpondant") des donnes ou un rsultat. Le serveur est un programme gnrique dont la seule fonction est de rpondre aux demandes des applications clientes, en fournissant en retour les donnes ou le rsultat. Les demandes des applications sont appeles gnralement des requtes. Le serveur est, par nature, indpendant des applications qui l'interrogent.
Dialogue Client Serveur
Initie et pilote le dialogue rpond au client, participe au dialogue
Est conforme au modle client-serveur, une application qui fait appel des services distants par des requtes, plutt que par un change de fichiers. Ce modle exige que les ordinateurs soient relis en rseau, et repose sur un protocole qui assure le bon fonctionnement des changes : - au niveau du client : mission de requtes (les appels de service) - au niveau du serveur : mission des rponses ou rsultats
5.2 Les principes de base
Comment peut-on dfinir un service?
La notion de service doit tre comprise travers la notion de traitement. Le modle client- serveur permet de rpartir les services utiliss par une application et non l'application elle-mme. Les traitements auxquels font appel les applications, requirent souvent beaucoup de ressources machine : il est donc prfrable, dans un souci de performance et d'efficacit, de les faire rsider chacun sur un ordinateur ddi, appel serveur.
Comment peut-on distinguer le cur d'une application et les services annexes de celle-ci que l'on doit dporter?
Une application informatique se compose fondamentalement de 3 niveaux :
* l'interface avec l'utilisateur, * les traitements, * les donnes.
Ces niveaux sont eux-mmes composs de couches : Base de donnes : SQL page 79
Gestion de affichage Interface Logique de l'affichage
Logique fonctionnelle Traitements Excution des procdures
Intgrit des donnes Donnes Gestion des donnes
Quel est le rle des diffrentes couches?
* La gestion de l'affichage : est assure par l'environnement d'exploitation (ex: Windows),
* La logique de l'affichage : transmet la gestion de l'affichage les directives de prsentation (ex : les feuilles et les contrles graphiques dans une application Visual Basic sous Windows),
* La logique fonctionnelle : reprsente l'arborescence algorithmique de l'application et aiguille le traitement vers les procdures qui sont droules et excutes dans la couche suivante (ex : les fonctions vnementielles en Visual Basic associes aux messages souris, clavier..)
* L'excution des procdures : effectue les traitements de l'application (ex : des ordres SQL lancs par les fonctions vnementielles, ou mieux des appels de procdures stockes),
* L'intgrit des donnes : vrifie l'utilisation cohrente des donnes par les diffrents processus,
* La gestion des donnes : permet la manipulation des donnes (slection ou mise jour des donnes).
5.3 Le dialogue entre client et serveur : l'IPC
Le dialogue s'effectue travers le rseau qui relie le client et le serveur : Une conversation de type client-serveur est un dialogue inter-processus qui s'appuie de part et d'autre sur 2 interfaces de niveau systme. Ce dialogue s'appelle un IPC (Inter Processus Communication) ou encore Middleware. L'IPC permet l'tablissement et le maintien du dialogue. Cest un ensemble de couches logicielles qui : - prend en compte les requtes de l'application cliente, - les transmet de faon transparente travers le rseau, - retourne les donnes ou les rsultats l'application cliente.
L'IPC est constitu par : - des API (Application Programming Interface) ou interface de programmation au niveau applicatif : l'API est une interface entre un programme et un systme. L'API encapsule des Base de donnes : SQL page 80
fonctions qui vont permettre l'application de faire appel aux services proposs par le serveur (ex : les WinSockets pour faire de la communication IP sous Windows) ; - des FAP (Format And Protocols) ou protocoles de communication et format des donnes : ce sont des procdures charges d'assurer la prsentation, les conversions de formats et de codification.
Application
Interface de programmation (API)
Protocole de communication et format (FAP)
Protocole de transport li au rseau
L'application ne voit que l'API, l'API n'est en contact qu'avec la FAP et la FAP fait la liaison avec les couches rseau. L'IPC est l'lment fondamental du fonctionnement client-serveur. Deux approches d'IPC existent : - Les RPC (Remote Procdure Call ou appels de procdure distance) pour les dialogues sans connexion ; - Par Messages : il faut alors tablir une session de communication entre Client et Serveur, et grer cette session.
5.4 Les mcanismes utiliss par les interfaces de communication
Les RPC Il s'agit de communication par change synchrone : chacun reste en attente de l'autre et ne peut rien faire pendant ce temps. La fiabilit est mdiocre : en cas dincident, il n'y a pas de reprise. Mais la mise en uvre est simple.
Client
Serveur
Appel de la procdure serveur et Attente de la rponse
prise en compte de la requte rveil du serveur excution de la procdure mission d'un message rponse unique
Rception du rsultat et reprise de l'excution
Les messages Le Client et le Serveur effectuent un change de messages. Le dialogue est asynchrone. C'est la demande de connexion du programme client qui est le point de dpart du dialogue. Ce mode de Base de donnes : SQL page 81
communication reprsente un "investissement" important, et ncessite un bon niveau d'expertise. Il n'est justifi que pour des changes intensifs.
Client
Serveur
Demande de connexion: envoi d'un message comportant l'identification du client
prise en compte de la demande et cration d'un contexte acceptation de la connexion Envoi d'une requte
excution de la requte Rception du rsultat
Synchronisation Envoi d'une requte
excution de la requte Rception du rsultat
Synchronisation
Schma en couches dun change client-serveur :
Application API Prsentation FAP Session FAP Transport TCP Rseau IP Liaison Ethernet, Token Ring Physique Coaxial
Le protocole de communication est contenu dans la couche FAP de l'IPC. Il gre l'ordonnancement de l'change : - ouvrir une session, - envoyer une requte, - faire remonter les rsultats.
Le protocole de transport prend les messages mis par les applications pour les insrer dans une trame, qui va circuler sur le rseau. Ex : TCP/IP
5.5 Les diffrentes mises en oeuvre du modle Le type de relation Client-Serveur est dtermin par l'activit du site serveur, c'est dire le service "dport" du cur de l'application. Selon la rpartition voque entre Donnes, Traitements et Prsentation, on peut distinguer plusieurs types de liaison Client-Serveur : Base de donnes : SQL page 82
- le client-serveur de prsentation, - le client-serveur de donnes, - le client-serveur de procdures.
Ces types ne sont pas exclusifs les uns des autres.
Le Client-Serveur de prsentation C'est le module Gestion de l'affichage, dport sur un systme spcialis, qui est le service. Ceci suppose de pouvoir sparer la gestion de l'affichage et la logique de l'affichage : par exemple sous X-Windows. Windows est un systme monolithique qui ne permet pas ce dcoupage.
Client Serveur logique de l'affichage gestion de l'affichage logique fonctionnelle Excution des procdures intgrit des donnes gestion des donnes
Le client-Serveur de donnes C'est le module de gestion des donnes qui est dport sur un serveur ddi ; on peut galement dporter le module d'intgrit des donnes. Ex : les SGBDR.
Client serveur Gestion de l'affichage intgrit des donnes Logique de l'affichage gestion des donnes Logique fonctionnelle Excution des procdures
Le Client-Serveur de procdure Ce type requiert plus de savoir faire pour sa mise en uvre : il s'agit l de dporter vers le serveur une partie des traitements, sans toucher la localisation de la Gestion des donnes et de la prsentation. La logique fonctionnelle de l'application rside toujours sur la station cliente. Cette partie logique effectue des appels ponctuels des traitements ou services de la station serveur. Ces services sont soit des applicatifs crits dans des langages classiques, soit des procdures catalogues toutes prtes, crites en SQL (ex : procdures stockes appeles en Visual Basic).
Client Serveur Gestion de l'affichage excution des procdures Logique de l'affichage Logique fonctionnelle Intgrit des donnes Gestion des donnes
Base de donnes : SQL page 83
5.6 Conclusion
Le Client-Serveur reprsente la solution pour aller vers une utilisation uniforme des moyens informatiques. Si le Client-Serveur ne permet pas de faire baisser les couts de projets, les avantages techniques apports par le modle client-serveur se traduisent par des atouts "stratgiques": - une approche "volutive" de la rnovation des systmes d'information, - un meilleur parti des ressources matrielles parpilles dans l'entreprise, - la prise en compte des nouvelles technologies.
Pour une prsentation dtaille des techniques Client/Serveur, lire la documentation Le Client/Serveur de Marc Fayolle.
Base de donnes : SQL page 84
6. LE CLIENT/SERVEUR AVEC ODBC ET ACCESS Dans les chapitres qui prcdent, nous avons dj utilis deux clients, sans nous proccuper de la manire dont ils communiquent avec le serveur de bases de donnes SQL SERVER : SQL Server Enterprise Manager , et Analyseur de Requtes . Ces clients propritaires Microsoft grent leur propre connexion au serveur, et ne peuvent pas se connecter des serveurs non Microsoft. Au contraire, linterface ODBC (Open Database Connectivity) permet de nombreux clients de se connecter vers des serveurs Microsoft, Oracle, Informix Cette norme de fait, qui a t cre par Microsoft est aujourdhui reconnue par la pluplart des serveurs de base de donnes. Ce chapitre montre comment configurer une source ODBC entre un client et un serveur, et utiliser ACCESS comme client, en liant les tables ACCESS une base distante sous SQL SERVER : il ne demande pas de connaissances particulires sur ACCESS. Dans la suite du module, nous verrons comment crer nos propres clients, en VISUAL BASIC avec la nouvelle interface ADO (ActiveX Data Object) qui remplace ODBC En annexe, vous trouverez des exemples de programmes client crits en langage C, utilisant lAPI ODBC
6.1 Cration dune source de donne ODBC Choisissez ODBC/32 dans le panneau de configuration Base de donnes : SQL page 85
Cliquez sur Ajouter (une source de donnes utilisateur)
Dans la fentre Crer une nouvelle source de donnes , choisir SQL SERVER , puis Terminer Nom de la source de donnes : nom de votre choix, qui rfrencera la base de donnes sur votre PC client (ex : sourcePubs) Description : commentaire libre Serveur : nom de la machine, o est installe la base de donnes (ex : serveur-tsig)
Base de donnes : SQL page 86
Dans la fentre suivante : choisissez lauthentification par SQL Server, et indiquer votre compte daccs et mot de passe.
Choisir le nom de la base de donnes sur le serveur (pubs)
Base de donnes : SQL page 87
6.2 Connexion une source de donnes sous Access
Crer une nouvelle base vide : <CTRL N>, OK pour Base de donnes vide , puis Crer Menu Insertion : Table Dans la fentre Nouvelle Table , choisir Attacher la table Dans le menu Type de fichier , choisir Bases de donnes ODBC () Base de donnes : SQL page 88
Slectionner longlet Source de donnes machine et la source de donnes que vous recherchez dans la fentre : choisir la source sourceCompagnie , aprs lavoir cre par la mthode indique dans ce qui prcde. Dans le menu Connexion SQL SERVER , loguez-vous sous le compte du propritaire de la base de donnes. Slectionner les tables seulement : Avion, Pilote, Vol, Affectation Vrifier que vous pouvez effectuer des oprations licites de consultation, de cration, de suppression de Nuples et que les erreurs dues aux contraintes sur les tables SQL SERVER sont bien rapatries vers ACCESS : doublons, plages permises, contraintes rfrentielles Consulter la dfinition des tables (avec lIcne Equerre Bleu), en lecture seulement, sous ACCESS et comparez le contenu des colonnes par rapport SQL Enterprise Manager : le type des colonnes, les contraintes de cl primaire, dindex, les colonnes obligatoires (NULL interdit) sont connues dACCESS, mais pas les autres contraintes de plage, de cl trangres, qui sont values uniquement par le serveur. Base de donnes : SQL page 89
ANNEXES Base de donnes : SQL page 90
GLOSSAIRE
Alias : Nom temporaire donn une table ou un attribut du rsultat d'une requte. Un alias dure le temps de l'excution de la requte, et n'a de sens que dans la requte o il est dfini.
Attribut (attribute) : Chaque colonne d'une relation. Les attributs d'une relation doivent tre uniques et sont normalement non ordonns. Un attribut est toujours au moins caractris par son type et sa longueur. L'ensemble des valeurs que peut prendre un attribut est le domaine de l'attribut. Le degr d'une relation est le nombre d'attributs de la relation.
Base de donnes (Data Base) : Ensemble logique de donnes constitu de tables ou de fichiers avec leur index, et d'un dictionnaire centralis permettant une gestion efficace des donnes.
Base de donnes relationnelle (Relational Data Base) : Base de donnes perue par ses utilisateurs comme une collection de tables. Ces tables sont manipules par un langage d'accs de quatrime gnration, ou en SQL. L'utilisateur prcise ce qu'il cherche dans la base et non comment il faut l'obtenir. Dans une base de donnes relationnelle, le SGBDR choisit le meilleur chemin d'accs pour optimiser l'utilisation des ressources (mmoire, disque, temps).
Champ (Field) : Synonyme d'attribut mais s'applique plutt pour un enregistrement dans un systme de gestion de fichiers classique (aussi appel zone).
Clause (Clause) : Mot rserv du langage SQL utilis pour spcifier ce qu'une commande doit faire, et souvent suivi d'une valeur. Dans la commande : 'SELECT DISTINCT clt_nom FROM clients' les mots SELECT, DISTINCT et FROM sont des clauses.
Cl (Key) : Attribut ou combinaison d'attributs utilis pour accder une table sur un critre particulier. Un index est construit sur une cl.
Cl trangre (Foreign Key) : Attribut ou groupe d'attributs d'une relation, cl primaire dans une autre relation, et constituant un lien privilgi entre relations.
Cl primaire (Primary Key) : Cl donnant accs de faon univoque, pour chacune de ses valeurs, un tuple de la table, (on dit parfois aussi identifiant ).
Cl secondaire (Secondary Key) : Cl donnant accs pour chacune de ses valeurs, un ensemble de tuples de la table, ceux-ci sont alors accds en squence. Base de donnes : SQL page 91
Cluster (Cluster) : Voir Groupement (de tables).
Colonne (Column) : Voir attribut.
Corrle (sous-requte) (Correlated query) : Sous-requte excute de faon rptitive, pour chaque tuple slectionn par la requte extrieure. A chaque excution de la sous-requte, le(s) tuple(s) trait(s) dpend(ent) de la valeur de un ou plusieurs attributs du tuple slectionn dans la requte extrieure.
Curseur (Cursor) : En SQL intgr, sorte de pointeur vers un tuple particulier de la table temporaire contenant le rsultat d'une requte. Le curseur fait le lien entre SQL, langage ensembliste, et le langage hte (C, COBOL,...) qui ne traite qu'un tuple la fois.
Dictionnaire de donnes (Data Dictionary) : Ensemble de tables et de vues contenant toutes les informations sur la structure d'une base de donnes. Le dictionnaire est utilis chaque requte pour vrifier la lgitimit et la cohrence de la commande.
Domaine (Domain) : Ensemble des valeurs que peut prendre un attribut.
Fonction de groupe (Group Function) : Fonction mathmatique s'appliquant sur toutes les valeurs d'un attribut ou d'une expression combinant plusieurs attributs, dans les tuples des groupes gnrs par une requte. La fonction calcule une seule valeur pour chaque groupe.
Groupement (de tables) (cluster) : groupe de deux ou plusieurs tables ayant des valeurs d'attributs identiques, et partageant le mme espace disque. Utilis pour acclrer les requtes multi-tables et pour diminuer l'espace occup.
Index (Index) : Objet d'une base de donnes permettant de trouver un tuple ou un ensemble de tuples dans une table sans examiner la table entirement. L'index possde une entre pour chaque valeur de la cl associe, couple un (des) pointeur(s) vers le(s) tuple(s) qui ont cette valeur.
Intgrit d'entit (ou de relation) (Integrity) : Rgle obligatoire dans une base de donnes relationnelle, spcifiant que les valeurs d'une cl primaire doivent tre uniques et non NULL.
Intgrit de rfrence (ou rfrentielle) (Referential Integrity) : Rgle de cohrence hautement souhaite dans une base de donnes relationnelle, obligeant vrifier la Base de donnes : SQL page 92
correspondance entre la valeur d'une cl trangre et celle de la cl primaire associe. Cette rgle doit tre vrifie chaque mise jour de la base.
Jointure (join) : Opration relationnelle couramment utilise en SQL pour retrouver simultanment des parties de tuples dans plusieurs tables. On associe cette jointure une condition (dite de jointure) spcifiant quels tuples des diffrentes tables doivent tre associs.
Jointure 'externe' : Voir 'outer join'.
Ligne (d'une table) (row) : Voir tuple.
'Outer join' : Jointure incluant tous les tuples d'une table, mme si l'autre table ne comprend aucun tuple satisfaisant la condition de jointure. Lorsque la condition de jointure ne peut tre respecte, des valeurs NULL sont insres pour les attributs manquants.
NULL : Valeur particulire d'un attribut, qui signifie "n'a pas de valeur" ou "valeur non applicable". Dans le premier cas, on ne connat pas la valeur au moment de l'encodage, et dans le second, l'attribut n'a pas de sens pour le tuple concern. Une requte peut slectionner ou ignorer les tuples avec valeurs NULL. La valeur NULL se distingue de "blanc" et zro.
Proprit (Property) : Voir attribut. S'emploie en conception de bases de donnes, notamment dans les mthodes MERISE, AXIAL, pour dsigner les divers lments d'une entit (ou d'une relation).
Privilge (Privilege) : Chacune des oprations qu'un utilisateur peut tre autoris effectuer sur un objet de la base ; le privilge est accord par le crateur de l'objet.
Relation (Relation) : Ensemble non ordonn de tuples. Une relation contient toujours une cl primaire. Chaque tuple est unique et est accessible de faon univoque par une valeur de la cl primaire. Une relation est toujours reprsente au niveau conceptuel, donc en SQL, comme une table deux dimensions, composes de lignes constitues d'attributs. Pour tre manipulable par SQL, une relation doit tre en "premire forme normale" (ou "normalise"), c'est dire que chaque attribut doit avoir une valeur atomique.
SGBDR (RDBMS) : Voir "Systme de gestion de bases de donnes relationnelles".
Base de donnes : SQL page 93
Sous-requte ou requte imbrique (Subquery) : Requte entoure de parenthses apparaissant dans un autre requte (appele requte extrieure), et permettant de conditionner la slection des tuples de cette dernire.
Synonyme (Synonym) : Nom donn une table ou une vue dans le but de simplifier les rfrences cet objet. Un synonyme est personnel et persiste jusqu' ce que son crateur le dtruise. Le synonyme est d'application dans toutes les requtes o l'objet intervient. A ne pas confondre avec 'alias'.
Systme de gestion de bases de donnes relationnelles : ensemble de programmes permettant la mmorisation, la manipulation et le contrle des donnes dans une ou plusieurs bases de donnes relationnelles. Outre le noyau relationnel qui gre les tables et optimise les requtes, un SGBDR possde un langage d'exploitation de quatrime gnration ainsi que divers outils (gnrateurs d'crans, de documents, d'applications,...) favorisant le dveloppement rapide d'applications. CODD et DATE ont dfini un ensemble de rgles strictes permettant de dterminer le niveau de 'relationnalit' d'un SGBDR.
Table (Table) : Voir relation.
Transaction (Transaction) : Ensemble logique d'vnements et d'actions qui modifient le contenu d'une base de donnes, faisant passer la base d'un tat cohrent un autre tat cohrent.
Tuple (Tuple) : Une ligne dans une relation (ou table). Un tuple est constitu de valeurs correspondant aux attributs qui constituent la relation. La cardinalit d'une relation est le nombre de tuples de la relation.
Vue (View) : Objet d'une base de donnes relationnelle et du langage SQL qui peut gnralement tre utilis comme une table. Une vue ralise un rsum, une simplification, ou une personnalisation de la base de donnes en regroupant des donnes slectionnes de plusieurs tables.
Base de donnes : SQL page 94
Corrigs des exercices complmentaires
Use AirRegis go
-- ajout d'une colonne Ville la table Pilote ALTER TABLE Pilote ADD Ville TypeVille NULL go
-- initialisation des Villes UPDATE Pilote SET ville = 'Bastia' WHERE IdPilote = 1
etc..
-- 1 Noms des pilotes qui habitent dans la ville de localisation d'un A320 (dans une ville -- desservie par un aroport o est bas un A320)
SELECT NomPilote FROM AVION av, AEROPORT ae, Pilote p WHERE TypeAvion = 'A320' AND BaseAeroport = IdAeroport AND NomVilleDesservie = Ville
-- 2 Noms des pilotes planifis pour des vols sur A320
SELECT Distinct NomPilote FROM AVION av,AFFECTATION af,Pilote p WHERE TypeAvion = 'A320' AND af.NumAvion = av.NumAvion AND af.IdPilote = p.IdPilote
-- 3Noms des pilotes planifis sur un A320, qui h abitent dans la ville de localisation d'un A320
SELECT Distinct NomPilote FROM AVION av, AEROPORT ae, Pilote p, AFFECTATION af WHERE TypeAvion = 'A320' AND BaseAeroport = IdAeroport AND NomVilleDesservie = Ville AND af.NumAvion = av.NumAvion AND af.IdPilote = p.IdPilote
-- 4Noms des pilotes planifis sur A320, qui n'ha bitent pas dans la ville de localisation d'un A320
SELECT Distinct NomPilote FROM AVION av, Pilote p, AFFECTATION af WHERE TypeAvion = 'A320' AND af.NumAvion = av.NumAvion AND af.IdPilote = p.IdPilote AND NomPilote not IN ( SELECT NomPilote FROM AVION av, AEROPORT ae, Pilote p WHERE TypeAvion = 'A320' AND BaseAeroport = IdAeroport AND NomVilleDesservie = Ville)
-- 5Noms des pilotes planifis sur A320 ou qui ha bitent la ville de localisation d'un A320
Base de donnes : SQL page 95
SELECT NomPilote FROM AVION av, AEROPORT ae, Pilote p WHERE TypeAvion = 'A320' AND BaseAeroport = IdAeroport AND NomVilleDesservie = Ville UNION SELECT Distinct NomPilote FROM AVION av, Pilote p, AFFECTATION af WHERE TypeAvion = 'A320' AND af.NumAvion = av.NumAvion AND af.IdPilote = p.IdPilote ORDER BY NomPilote
-- 6 Pour chaque ville desservie, donner la moyen ne des capacits des avions qui sont -- localiss dans un aroport desservant cette ville
SELECT 'Ville ' = NomVilleDesservie, 'Moyenne des capacits' = AVG (Capacite), 'Minimum' = MIN (Capacite), 'Maximum' = MAX (Capacite) FROM AEROPORT, AVION av, TYPE ty WHERE IdAeroport = BaseAeroport AND av.TypeAvion = ty.TypeAvion Group By NomVilleDesservie
-- 6Mme question, limite aux villes o sont loc aliss plus de deux avions
SELECT 'Ville ' = NomVilleDesservie, 'Moyenne des capacits' = AVG (Capacite), 'Minimum' = MIN (Capacite), 'Maximum' = MAX (Capacite) FROM AEROPORT, AVION av, TYPE ty WHERE IdAeroport = BaseAeroport AND av.TypeAvion = ty.TypeAvion Group By NomVilleDesservie Having count(NumAvion) > 2
-- 7 Afficher les noms des pilotes qui ne piloten t que des A320
SELECT NomPilote FROM Pilote p WHERE IdPilote IN (SELECT IdPilote FROM AFFECTATION) AND 'A320' = ALL (SELECT Distinct TypeAvion From AFFECTATION af, AVION av WHERE af.NumAvion = av.NumAvion AND p.IdPilote = af.IdPilote)
-- 8 Afficher les noms des pilotes qui pilotent t ous les A320 de la compagnie
SELECT NomPilote FROM Pilote p WHERE (SELECT count (NumAvion) FROM Avion WHERE TypeAvion = 'A320') = (SELECT count (DISTINCT af.NumAvion) From AFFECTATION af, AVION av WHERE af.NumAvion = av.NumAvion AND p.IdPilote = af.IdPilote AND TypeAvion = 'A320' ) Base de donnes : SQL page 96
Le Client/Serveur avec linterface ODBC en langage C
Squence fournie titre de documentation, pour loption Informatique embarque . Bien quelle soit en gnral remplace par linterface ADO appele en Visual Basic, ou JDBC en langage Java, cette technique peut encore tre rencontre dans des projets industriels. Visual Studio : Platform SDK, Database and Messaging Services
Plan dune requte ODBC
1. Connectez-vous la source de donnes, en prcisant le nom de la source, le nom de lutilisateur, le mot de passe (SQLConnect)
2. Excutez une ou plusieurs instructions SQL : Lapplication C doit ranger le texte de lappel SQL dans un buffer, avec les paramtres ventuels ; Si linstruction retourne un ensemble de rsultats, lapplication associe un nom de curseur au rsultat (SQLSetCursorName) : le driver rangera ses valeurs dans ce curseur ; Lapplication envoie linstruction au serveur SQL pour excution immdiate, ou pour prparer lexcution (SQLExecDirect ou SQLPrepare, suivi de SQLExecute) Si linstruction SQL a cr un ensemble de rsultats, lapplication peut interroger le serveur sur les caractristiques du rsultat, comme le nombre de colonnes, le nom et le type de chaque colonne du rsultat. Elle peut associer une variable C de stockage chaque colonne (SQLBindCol), et lire lensemble de rsultats ligne par ligne (SQLFetch). Si linstruction cause une erreur, lapplication peut demander des informations complmentaires sur lerreur au driver ODBC (SQLError).
3. Terminez chaque transaction en leffectuant ( commiting ) ou en revenant en arrire ( rolling back ), par SQLTransact (SQL_COMMIT ou SQL_ROLLBACK) ;
4. Fermer la connexion la fin Base de donnes : SQL page 97
Exemple dinterrogation dune base en ODBC /******************************************************************************** Programmation ODBC Fichier : ODBC1.C Exemple de base Auteur : Philippe Garaud, Rgis Lcu Date : 15 oct 97 Fonction : connexion ODBC la base de donnes d'exemple PUBS et lecture de la table auteurs ***********************************************************************************/ #include <windows.h> #include <stdio.h> #include <stdlib.h> #include <SQL.h> // fichiers include include pour appels SQL #include <SQLEXT.H>
/* SQLAllocEnv alloue la mmoire pour le handler d'environnement henv (paramtre en sortie) et initialise l'API ODBC. Doit tre appele avant tout appel ODBC*/ retcode = SQLAllocEnv (&henv) ; if (retcode == SQL_SUCCESS) { message ("allocation environnement OK\n"); /* SQLAllocConnect alloue la mmoire pour un handle de connexion hdbc (paramtre en sortie) dans l'environnement identifie par henv (paramtre en entre) */ Base de donnes : SQL page 98
retcode = SQLAllocConnect(henv, &hdbc);
if (retcode == SQL_SUCCESS) { /* SQLConnect charge un driver, et se connecte une source de donnes, sous un compte utilisateur pass en paramtre */
retcode = SQLConnect ( hdbc, // handler de connexion (en entre) "sourcePubs", // nom de la source de donnes SQL_NTS, // nb d'octets du nom (SQL_NTS = maximum permis par NT) // permis par NT) "Stage", // nom d'accs SQL SERVER SQL_NTS, "stage", // mot de passe de connexion SQL_NTS);
if ((retcode == SQL_SUCCESS) || (retcode == SQL_SUCCESS_WITH_INFO)) { /* Appels SQL la base de donnes, aprs connexion russie */ message ("connection a la source de donnee OK\n");
/* Alloue la mmoire pour un handler d'instruction hstmt */ retcode = SQLAllocStmt(hdbc, &hstmt);
/* SQLExecDirect lance une instruction SQL (2me paramtre) dans le contexte du handler d'instruction hstmt */ retcode = SQLExecDirect (hstmt, // handler d'instruction "SELECT nom_auteur FROM auteurs", // instruction SQL SQL_NTS); // nb octets instruction
if (retcode == SQL_SUCCESS) { message ("interrogation SQL OK\n");
// SQLBindCol attache une colonne de la table cre par l'instruction SQL // une zone de stockage qui va recevoir les valeurs de la colonne SQLBindCol (hstmt, // handler d'instruction 1, // numro de colonne dans la table construite par l'interrogation SQL_C_CHAR, // type SQL de la colonne szName, // buffer de lecture NAME_LEN, // taille du buffer de lecture &cbName); // adresse du nombre d'octets effectivement lus
// SQLFetch lit une ligne dans la zone de stockage : le driver retourne les // colonnes qui ont t attaches la zone de stockage par SQLBindCol.
SQLFreeStmt(hstmt, SQL_DROP); // libration de la mmoire du handler d'instruction } SQLDisconnect(hdbc); // dconnexion de la source de donnes } else odbc_erreur(henv,hdbc,SQL_NULL_HSTMT,"erreur connect");
SQLFreeConnect(hdbc); // libration de la connexion la source Base de donnes : SQL page 99
} SQLFreeEnv(henv); // libration de l'environnement } }
SQLError(henv, // handler d'environnement hdbc, // handler de connexion hstmt, // handler d'instructions sqlstate, // compte rendu SQL standard &nativcode, // compte rendu dpendant du type de base (SQL SERVER, ACCESS...) message_erreur, // message d'erreur SQL (SWORD)MESS_LEN, // taille max du buffer d'erreur &message_long); // longueur effective du message d'erreur
if (message_long > 60) { for (i=60;(i<message_long) && (message_erreur[i] != ' ');i++); message_erreur[i] = '\n'; }
Exercice : interrogation de votre base Compagnie arienne en Client Serveur
En vous inspirant de lexemple prcdent et en faisant des recherches documentaires sur chaque fonction OBDC utilise, crire un programme qui affiche les noms des pilotes (champ Nom, table Pilote) : vous devrez dabord crer une nouvelle source de donnes. Base de donnes : SQL page 100
Transaction de lecture et dcriture concurentielle : verrouillage de tables /******************************************************************************** Programmation ODBC Fichier : ODBClect.C Auteur : Philippe Garaud, Rgis Lcu Date : oct 97 Fonction : ralise une lecture verrouille sur la table magasins Utilisation : lancer en concurrence avec ODBCins.c pour illustrer le verrouillage de tables ***********************************************************************************/ #include <windows.h> #include <stdio.h> #include <stdlib.h> #include <SQL.h> // fichiers include include pour appels SQL #include <SQLEXT.H> #define NAME_LEN 30 #define BDAY_LEN 11 #define MESS_LEN 100
// Fonction d'affichage d'erreur void odbc_erreur(HENV henv,HDBC hdbc, char *mess); // Affichage d'un message et attente de return void message(char *mess);
SQLError (henv, // handler d'environnement hdbc, // handler de connexion SQL_NULL_HSTMT, // pas de handler d'instructions NULL, // pas de compte rendu SQL standard NULL, // pas de compte rendu spcifique message_erreur, // message d'erreur SQL (SWORD)MESS_LEN, // taille max du buffer d'erreur &message_long); // longueur effective du message d'erreur
if (message_long > 60) { for (i=60;(i<message_long) && (message_erreur[i] != ' ');i++); message_erreur[i] = '\n'; } if (message_long != 0) printf ("%s ", message_erreur);
printf("<TAPER RETURN>"); getchar();} Base de donnes : SQL page 102
/******************************************************************************** Programmation ODBC Fichier : ODBCins.C Auteur : Philippe Garaud, Rgis Lcu Date : oct 97 Fonction : Mise jour d'une base de donnes en ODBC - cre un nuple dans la table Magasins de la base PUBS en ne renseignant que id_mag (saisi au clavier) - l'issue d'une transaction correcte, l'utilisateur peut choisir de la valider (COMMIT) ou de l'annuler compltement (ROLLBACK) Utilisation : - Vrifier les retours d'erreur en tapant des doublons (contrainte sur la cl primaire id_mag) - Vrifier le fonctionnement de COMMIT et ROLLBACK en relisant la table en SQL intratif (select * from magasins) - Vrifier le mcanisme de verrouillage de la table : * pendant toute la dure de la transaction, jusqu' COMMIT et ROLLBACK, le SQL intratif est suspendue : essayer des transactions SELECT, UPDATE, DELETE concurrente * lancer en concurrence avec ODBClect.exe qui verrouille la table en lecture. ***********************************************************************************/ #include <windows.h> #include <stdio.h> #include <stdlib.h> #include <SQL.h> // fichiers include include pour appels SQL #include <SQLEXT.H>
SQLError (henv, // handler d'environnement hdbc, // handler de connexion SQL_NULL_HSTMT, // pas de handler d'instructions NULL, // pas de compte rendu SQL standard NULL, // pas de compte rendu spcifique message_erreur, // message d'erreur SQL (SWORD)MESS_LEN, // taille max du buffer d'erreur &message_long); // longueur effective du message d'erreur
if (message_long > 60) { for (i=60;(i<message_long) && (message_erreur[i] != ' ');i++); message_erreur[i] = '\n'; } if (message_long != 0) printf ("%s ", message_erreur);
printf("\n%s",mess); SQLError(henv, // handler d'environnement hdbc, // handler de connexion hstmt, // handler d'instructions sqlstate, // compte rendu SQL standard &nativcode, // compte rendu dpendant du type de base (SQL SERVER message_erreur, // message d'erreur SQL (SWORD)MESS_LEN,// taille max du buffer d'erreur &message_long); // longueur effective du message d'erreur
if (message_long > 60) { for (i=60;(i<message_long) && (message_erreur[i] != ' ');i++); message_erreur[i] = '\n'; }
printf( " SQLSTATE : %s CODE NATIF : %d\n", sqlstate, nativcode); if (message_long != 0) printf ("%s\n", message_erreur); } Base de donnes : SQL page 105
Exercice : Interrogation et mise jour, avec verrouillage des tables
Ralisez une maquette dapplication en C qui peut crer une nouvelle ligne dans la table Avion, ou relire toutes les colonnes de la mme table, dans deux transactions indpendantes qui verrouillent laccs la table en mode exclusif - Pensez lier chaque colonne une variable C, en prenant les types convenables - Rcuprez les fonctions odbc_erreur et odbcSans_erreur dans ODBCcurs.c : ces versions quittent le programme en cas derreur et simplifient le plan du programme ( ! !) - Dans le cas de linsertion, sil y a erreur, prvenir lutilisateur et faire un ROLLBACK, sans quitter lapplication. Modifier la fonction odbc_erreur pour grer les erreurs rcuprables : insertion dun doublon - Dans le cas de linsertion, demandez une validation ou annulation de la transaction lutilisateur - Pour laffichage, posez une question Fin de transaction pour que lon reste un moment dans la transaction (BUT : voir les verrouillages avec linsertion)
Vrifiez que ce verrouillage ne bloquent pas les autres tables, en relanant lexercice prcdent qui lit la table Pilote
Vrifiez que lon peut lancer N lectures concurentes mais quune criture dans la table bloque la fois les demandes de lecture et dcriture suivantes (modle Lecteur- Rdacteur)
Base de donnes : SQL page 106
Complments sur les curseurs /******************************************************************************** Programmation ODBC Fichier : ODBCcurs.C Auteur : Philippe Garaud, Rgis Lcu Date : oct 97 Fonction : Utilisation d'un curseur en lecture seule (premire transaction) puis modification d'une colonne de la table auteurs, par une requte UPDATE ***********************************************************************************/ (extrait de code : ne rpte pas les fonctions obdc_erreur et les dclarations courantes)
UCHAR id_aut [NB_ID+1]; // noter +1 pour le 0 binaire SDWORD nb_id; UCHAR nom_aut [NB_NOM+1], nouveau[NB_NOM+1] ; SDWORD nb_nom; int iligne; char requete [100];
printf("ODBC : LECTURE a l'aide d'un CURSEUR et Mise a jour\n");
allocation de lenvironnenement, de la connexion, connexion, option de connexion avec SQL_AUTOCOMMIT, allocation du handler dinstruction
/* SQLSetStmtOption dfinit les options pour un handler d'instruction (hstmt). (Pour fixer une option globale une connexion hdbc : SQLSetConnectOption)
L'option SQL_CONCURRENCY dfinit l'accs concurrent au curseur : SQL_CONCUR_READ_ONLY : pas de mise jour, (valeur par dfaut) SQL_CONCUR_LOCK : verrouillage minimum pour permettre la mise jour d'une ligne SQL_CONCUR_ROWVER : verouillage "optimiste", compare les versions des lignes aprs modif. */ retcode = SQLSetStmtOption (hstmt, // handler d'instruction SQL_CONCURRENCY, // option SQL_CONCUR_READ_ONLY);// valeur de l'option
/* Option : type de curseur utilis : SQL_CURSOR_FORWARD_ONLY = curseur squentiel (avance seulement) SQL_CURSOR_STATIC = les donnes slectionnes sont statiques. SQL_CURSOR_DYNAMIC = sauvegarde uniquement les cls des lignes slectionnes par l'instruction SQL ("rowset") */
if (retcode != SQL_SUCCESS) odbc_erreur(henv,hdbc,hstmt, "erreur statement option TYPE CURSEUR");
// Donne un nom au curseur pour utilisation future SQLSetCursorName (hstmt, "Curs1", SQL_NTS);
retcode = SQLExecDirect (hstmt, "SELECT id_auteur, nom_auteur FROM auteurs", SQL_NTS); Base de donnes : SQL page 107
if (retcode != SQL_SUCCESS) odbc_erreur (henv,hdbc,hstmt, "erreur SQL");
message ("DEBUT TRANSACTION : curseur cree");
SQLBindCol(hstmt, 1, // numro de colonne dans le curseur rsultat ( partir de 1) SQL_C_CHAR, // type SQL id_aut, // variable C attache la colonne NB_ID, // nb octets de la donne SQL &nb_id);
message ("FIN TRANSACTION DE LECTURE ?"); SQLTransact(henv,hdbc,SQL_COMMIT);
// PHASE 2 : modification du nom d'un auteur printf ("Nom a modifier ?"); scanf ("%s", nom_aut); printf ("Nouveau nom ?"); scanf ("%s", nouveau); sprintf (requete, "UPDATE auteurs SET nom_auteur='%s' WHERE nom_auteur='%s'", nouveau, nom_aut); printf ("VOTRE REQUETE: %s\n", requete); if (SQLExecDirect (hstmt, requete, SQL_NTS) !=SQL_SUCCESS) odbc_erreur(henv,hdbc,hstmt, "erreur SQLExecDirect");
message ("FIN TRANSACTION DE MISE A JOUR ?"); SQLTransact(henv,hdbc,SQL_COMMIT);
libration du handler dinstruction, dconnexion, libration connexion et handler denvironnement }
Base de donnes : SQL page 108
Table des matires ............................................................................... ERREUR ! SIGNET NON DEFINI. 1. PRESENTATION DU LANGAGE SQL ............................................................... 3 1.1 Ressources ............................................................................................................................................... 3 1.2 Historique du langage ............................................................................................................................. 3 1.3 Notion de relation ................................................................................................................................... 3 1.4 Rappels dalgbre relationnel ................................................................................................................ 8 1.5 Place de SQL dans les SGBDR ............................................................................................................ 12 2. DECOUVERTE PRATIQUE DU LANGAGE SQL ........................................... 13 2.1 Connexion la base de donnes PUBLI .............................................................................................. 13 2.2 Description de la base de donnes PUBLI .......................................................................................... 13 2.3 Consultation dune base de donnes .................................................................................................... 23 2.4 Mise jour dune base de donnes ...................................................................................................... 35 3. CREATION DE LA BASE COMPAGNIE AERIENNE ................................... 38 3.1 Introduction ........................................................................................................................................... 38 3.2 Cration des domaines .......................................................................................................................... 38 3.3 Cration et suppression de tables. Contraintes dintgrit ............................................................... 41 3.4 Cration de vues .................................................................................................................................... 45 3.5 Dfinition des permissions sur les objets dune base de donne ........................................................ 47 3.6 Les procdures stockes........................................................................................................................ 50 3.7 Les dclencheurs (trigger) .................................................................................................................... 54 3.8 Les index ................................................................................................................................................ 58 3.9 Rcapitulation ....................................................................................................................................... 60 4. LES TRANSACTIONS ...................................................................................... 70 5. LE MODELE CLIENT/SERVEUR .................................................................... 78 5.1 Introduction ........................................................................................................................................... 78 5.2 Les principes de base ............................................................................................................................ 78 Base de donnes : SQL page 109
5.3 Le dialogue entre client et serveur : l'IPC .......................................................................................... 79 5.4 Les mcanismes utiliss par les interfaces de communication ........................................................... 80 5.5 Les diffrentes mises en oeuvre du modle ......................................................................................... 81 Le Client-Serveur de prsentation ..................................................................................................................... 82 Le client-Serveur de donnes ............................................................................................................................. 82 Le Client-Serveur de procdure ......................................................................................................................... 82 5.6 Conclusion ............................................................................................................................................. 83 6. LE CLIENT/SERVEUR AVEC ODBC ET ACCESS .......................................... 84 6.1 Cration dune source de donne ODBC .................................................................................................... 84 6.2 Connexion une source de donnes sous Access ........................................................................................ 87 ANNEXES ................................................................................................................ 89 GLOSSAIRE ....................................................................................................................................................... 90 Corrigs des exercices complmentaires ........................................................................................................... 94 Le Client/Serveur avec linterface ODBC en langage C .................................................................................. 96