├── LICENSE ├── README.md └── biblio.sql /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2025 Mohammed Mehdi Boudir 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | ```markdown 4 | # Gestion de Bibliothèque 5 | 6 | Ce projet propose un système de gestion de bibliothèque utilisant SQL Server. Il couvre la création et la gestion d'une base de données pour les auteurs, livres, membres, et emprunts, avec des fonctionnalités avancées comme les procédures stockées, les triggers, et l'indexation. 7 | 8 | --- 9 | 10 | ## 🛠 Fonctionnalités 11 | 12 | - **Gestion des auteurs, livres, membres et emprunts** : 13 | - Ajout, modification et suppression des enregistrements. 14 | - **Procédures stockées** : 15 | - Ajout de membres. 16 | - Ajout d'emprunts. 17 | - Mise à jour de la date de retour des emprunts. 18 | - **Création de vues** : 19 | - Vue des emprunts en cours avec les informations détaillées des livres et des membres. 20 | - **Triggers SQL** : 21 | - Vérification des règles métier lors de l'ajout ou de la mise à jour des emprunts. 22 | - **Indexation** : 23 | - Accélération des recherches sur les noms d'auteurs et les titres des livres. 24 | 25 | --- 26 | 27 | ## 🚀 Instructions d'Utilisation 28 | 29 | ### Étape 1 : Création de la Base de Données 30 | ```sql 31 | CREATE DATABASE Bibliothèque; 32 | ``` 33 | 34 | ### Étape 2 : Création des Tables 35 | Les tables suivantes sont créées pour gérer les données : 36 | - **Auteurs** 37 | - **Livres** 38 | - **Membres** 39 | - **Emprunts** 40 | 41 | Voir le code SQL dans ce dépôt pour plus de détails. 42 | 43 | ### Étape 3 : Insertion des Données 44 | Ajoutez des auteurs, livres, membres et emprunts à l'aide des scripts d'insertion fournis. 45 | 46 | ### Étape 4 : Requêtes SQL 47 | Exécutez des requêtes pour récupérer des informations sur les livres, les membres, et les emprunts. 48 | 49 | --- 50 | 51 | ## 💡 Fonctionnalités Avancées 52 | 53 | 1. **Vues** : 54 | - `VueEmpruntsActuels` : Affiche les emprunts en cours avec les informations associées. 55 | 56 | 2. **Triggers** : 57 | - `Trg_AfterInsert_Emprunts` : Vérifie si un livre est déjà emprunté avant d'ajouter un nouvel emprunt. 58 | - `Trg_BeforeUpdate_Emprunts` : Vérifie que la date de retour est supérieure à la date d'emprunt. 59 | 60 | 3. **Procédures Stockées** : 61 | - `AjouterMembre` : Ajoute un nouveau membre. 62 | - `AjouterEmprunt` : Ajoute un nouvel emprunt. 63 | - `RetournerLivre` : Met à jour la date de retour d'un emprunt. 64 | 65 | 4. **Indexation** : 66 | - Accélération des recherches par nom d'auteur et titre de livre. 67 | 68 | --- 69 | 70 | ## 📄 Requêtes Importantes 71 | 72 | - **Liste des livres et leurs auteurs** : 73 | ```sql 74 | SELECT Livres.Titre, Auteurs.Nom, Auteurs.Prenom 75 | FROM Livres 76 | INNER JOIN Auteurs ON Livres.AuteurID = Auteurs.AuteurID; 77 | ``` 78 | 79 | - **Membres ayant emprunté un livre** : 80 | ```sql 81 | SELECT DISTINCT Nom, Prenom 82 | FROM Membres 83 | INNER JOIN Emprunts ON Membres.MembreID = Emprunts.MembreID; 84 | ``` 85 | 86 | - **Livres actuellement empruntés** : 87 | ```sql 88 | SELECT Titre, DateRetour 89 | FROM Livres L 90 | JOIN Emprunts E ON L.LivreID = E.LivreID 91 | WHERE E.DateRetour IS NULL; 92 | ``` 93 | 94 | --- 95 | 96 | ## 📌 À Propos 97 | Ce projet met en œuvre des concepts avancés de SQL Server pour gérer efficacement une bibliothèque. Il est conçu pour les étudiants et développeurs souhaitant apprendre et expérimenter les bases de données relationnelles. 98 | 99 | --- 100 | 101 | ### 📝 Licence 102 | Ce projet est sous licence MIT. Consultez le fichier [LICENSE](LICENSE) pour plus de détails. 103 | ``` 104 | 105 | Ajoutez ce fichier README à votre dépôt pour donner une description claire et détaillée de votre projet. Si vous souhaitez des modifications supplémentaires, n'hésitez pas à demander ! 😊 106 | -------------------------------------------------------------------------------- /biblio.sql: -------------------------------------------------------------------------------- 1 | /*Étape 1 : Création de la Base de Données 2 | 3 | Créer une nouvelle base de données appelée Bibliotheque.*/ 4 | 5 | create database Bibliothèque; 6 | 7 | /*Étape 2 : Création des Tables*/ 8 | 9 | /*Créer une table Auteurs*/ 10 | 11 | create table Auteurs ( 12 | AuteurID INT PRIMARY KEY IDENTITY, 13 | Nom VARCHAR(100), 14 | Prenom VARCHAR(100), 15 | DateNaissance DATE 16 | ); 17 | 18 | /*Créer une table Livres*/ 19 | 20 | create table Livres ( 21 | LivreID INT PRIMARY KEY IDENTITY, 22 | Titre VARCHAR(200), 23 | Genre VARCHAR(50), 24 | AuteurID INT FOREIGN KEY references Auteurs(AuteurID) 25 | ); 26 | 27 | /*Créer une table Membres*/ 28 | 29 | create table Membres ( 30 | MembreID INT PRIMARY KEY IDENTITY, 31 | Nom VARCHAR(100), 32 | Prenom VARCHAR(100), 33 | DateInscription DATE 34 | ); 35 | 36 | /*Créer une table Emprunts*/ 37 | 38 | create table Emprunts ( 39 | EmpruntID INT PRIMARY KEY IDENTITY, 40 | MembreID INT FOREIGN KEY references Membres(MembreID), 41 | LivreID INT FOREIGN KEY references Livres(LivreID), 42 | DateEmprunt DATE, 43 | DateRetour DATE 44 | ); 45 | 46 | /*Étape 3 : Insertion de Données*/ 47 | 48 | GO 49 | INSERT INTO Auteurs (Nom, Prenom, DateNaissance) VALUES 50 | ('Hugo', 'Victor', '1802-02-26'), 51 | ('Dumas', 'Alexandre', '1802-07-24'), 52 | ('Zola', 'Émile', '1840-04-02'); 53 | GO 54 | 55 | INSERT INTO Livres (Titre, Genre, AuteurID) VALUES 56 | ('Les Misérables', 'Roman', 1), 57 | ('Notre-Dame de Paris', 'Roman', 1), 58 | ('Le Comte de Monte-Cristo', 'Aventure', 2), 59 | ('Les Trois Mousquetaires', 'Aventure', 2), 60 | ('Germinal', 'Roman', 3); 61 | GO 62 | 63 | INSERT INTO Membres (Nom, Prenom, DateInscription) VALUES 64 | ('Dupont', 'Jean', '2024-01-15'), 65 | ('Martin', 'Sophie', '2024-02-20'), 66 | ('Bernard', 'Luc', '2024-03-05'), 67 | ('Petit', 'Marie', '2024-04-10'), 68 | ('Roux', 'Pierre', '2024-05-15'), 69 | ('Moreau', 'Lucie', '2024-06-20'), 70 | ('Simon', 'Paul', '2024-07-25'); 71 | GO 72 | 73 | INSERT INTO Emprunts (MembreID, LivreID, DateEmprunt, DateRetour) VALUES 74 | (1, 1, '2024-06-01', '2024-06-15'), 75 | (2, 2, '2024-06-05', '2024-06-20'), 76 | (3, 3, '2024-06-10', '2024-06-25'), 77 | (4, 4, '2024-06-15', '2024-06-30'), 78 | (5, 5, '2024-06-20', '2024-07-05'), 79 | (6, 1, '2024-06-25', '2024-07-10'), 80 | (7, 2, '2024-06-30', '2024-07-15'), 81 | (1, 3, '2024-07-01', '2024-07-16'), 82 | (2, 4, '2024-07-05', '2024-07-20'), 83 | (3, 5, '2024-07-10', '2024-07-25'); 84 | GO 85 | 86 | /*Étape 4 : Requêtes SQL*/ 87 | 88 | /*Sélectionner tous les livres et leurs auteurs.*/ 89 | 90 | select Livres.Titre , Auteurs.Nom,Auteurs.Prenom from Livres inner join Auteurs 91 | on Livres.AuteurID=Auteurs.AuteurID; 92 | 93 | /*Sélectionner tous les membres qui ont emprunté un livre.*/ 94 | 95 | select distinct nom , prenom from Membres inner join Emprunts 96 | on Membres.MembreID=Emprunts.MembreID ; 97 | 98 | /*Sélectionner tous les livres qui sont actuellement empruntés (DateRetour est NULL).*/ 99 | 100 | SELECT Titre, DateRetour 101 | FROM Livres L 102 | JOIN Emprunts E ON L.LivreID = E.LivreID 103 | WHERE E.DateRetour IS NULL; 104 | 105 | /*Mettre à jour la date de retour d'un emprunt.*/ 106 | 107 | update Emprunts set DateRetour='2024-05-25' where EmpruntID=10; 108 | 109 | /*Supprimer un membre.*/ 110 | 111 | select * from Membres; 112 | select * from Emprunts; 113 | select * from Livres; 114 | 115 | delete from Emprunts where EmpruntID=7; 116 | delete from Membres where MembreID=7; 117 | 118 | /*Étape 5 : Création de Vues*/ 119 | /*Créer une vue VueEmpruntsActuels qui affiche les emprunts en cours, 120 | avec les informations sur les livres et les membres.*/ 121 | 122 | create view VueEmpruntsActuels as 123 | select E.empruntID,M.membreID,M.nom,M.prenom,L.livreID,L.titre,L.genre,E.dateEmprunt,E.dateRetour 124 | from Emprunts E 125 | join Membres M on E.membreID=M.membreID 126 | join Livres L on E.livreID=L.livreID 127 | where E.dateRetour is null; 128 | 129 | /*Étape 6 : Création de Procédures Stockées*/ 130 | /*Créer une procédure stockée AjouterMembre pour ajouter un nouveau membre. Les paramètres sont Nom, Prenom, et DateInscription. 131 | */ 132 | 133 | create procedure AjouterMembre 134 | @Nom varchar(100), 135 | @Prenom varchar(100), 136 | @DateInscription date 137 | as 138 | begin 139 | insert into Membres (Nom,Prenom,DateInscription) values (@Nom,@Prenom,@DateInscription); 140 | end; 141 | 142 | 143 | exec ajouterMembre @nom='Dupuis', @prenom='Jean', @DateInscription='2024-08-01'; 144 | 145 | /*Créer une procédure stockée AjouterEmprunt pour ajouter un nouvel emprunt. 146 | Les paramètres sont MembreID, LivreID, et DateEmprunt.*/ 147 | 148 | create procedure AjouterEmprunt 149 | @MembreID int, 150 | @LivreID int, 151 | @DateEmprunt date 152 | as 153 | begin 154 | insert into Emprunts (MembreID, LivreID, DateEmprunt) 155 | VALUES (@MembreID, @LivreID, @DateEmprunt); 156 | end; 157 | 158 | exec AjouterEmprunt @MembreID=8, @LivreID = 1, @DateEmprunt='2024-08-08'; 159 | select * from Emprunts; 160 | /*Créer une procédure stockée RetournerLivre pour mettre 161 | à jour la date de retour d'un emprunt. Les paramètres sont EmpruntID et DateRetour. 162 | */ create procedure RetournerLivre 163 | @EmpruntID int, 164 | @DateRetour date 165 | as 166 | begin 167 | update Emprunts set DateRetour=@DateRetour where EmpruntID=@EmpruntID; 168 | end; 169 | exec RetournerLivre @DateRetour='2024-08-20' , @EmpruntID=11; 170 | select * from Emprunts; 171 | 172 | /*Étape 7 : Création de Triggers*/ 173 | 174 | /*Créer un trigger Trg_AfterInsert_Emprunts qui vérifie après l'insertion 175 | d'un nouvel emprunt si le livre est déjà emprunté (DateRetour est NULL), et lève une erreur si c'est le cas. 176 | */ 177 | 178 | CREATE TRIGGER Trg_AfterInsert_Emprunts 179 | ON Emprunts 180 | after INSERT 181 | AS 182 | BEGIN 183 | IF EXISTS ( 184 | SELECT 1 185 | FROM Emprunts e 186 | INNER JOIN inserted i ON e.LivreID = i.LivreID 187 | WHERE e.DateRetour IS NULL 188 | ) 189 | BEGIN 190 | RAISERROR ('Le livre est déjà emprunté.', 16, 1); 191 | ROLLBACK TRANSACTION; 192 | 193 | END 194 | END; 195 | 196 | insert into Emprunts (MembreID,LivreID,DateEmprunt) values (8,1,'2024-08-10'); 197 | 198 | /*Créer un trigger Trg_BeforeUpdate_Emprunts qui vérifie avant la mise à jour de la date de retour si la nouvelle date 199 | de retour est supérieure à la date d'emprunt, et lève une erreur si ce n'est pas le cas.*/ 200 | 201 | CREATE TRIGGER Trg_BeforeUpdate_Emprunts 202 | ON Emprunts 203 | instead of UPDATE 204 | AS 205 | BEGIN 206 | IF EXISTS ( 207 | SELECT 1 208 | FROM Emprunts e 209 | INNER JOIN inserted i ON e.EmpruntID = i.EmpruntID 210 | WHERE i.DateRetour < e.DateEmprunt 211 | ) 212 | BEGIN 213 | RAISERROR ('La date de retour doit être supérieure à la date d''emprunt.', 16, 1); 214 | ROLLBACK TRANSACTION; 215 | END 216 | END; 217 | 218 | update Emprunts set DateRetour='2024-08-05' where EmpruntID=11; 219 | 220 | /*Étape 8 : Indexation*/ 221 | 222 | /*Créer un index sur la colonne Nom de la table Auteurs pour accélérer les recherches par nom.*/ 223 | CREATE INDEX idx_Nom_Auteurs ON Auteurs (Nom); 224 | 225 | /*Créer un index sur la colonne Titre de la table Livres pour accélérer les recherches par titre.*/ 226 | create index idx_Titre on Livres(Titre); 227 | 228 | --------------------------------------------------------------------------------