SQL: Contraintes et Triggers Chapitre 5, 5.7-5.8 The slides for this text are organized into chapters. This lecture covers Chapter 5. Chapter 1: Introduction to Database Systems Chapter 2: The Entity-Relationship Model Chapter 3: The Relational Model Chapter 4 (Part A): Relational Algebra Chapter 4 (Part B): Relational Calculus Chapter 5: SQL: Queries, Programming, Triggers Chapter 6: Query-by-Example (QBE) Chapter 7: Storing Data: Disks and Files Chapter 8: File Organizations and Indexing Chapter 9: Tree-Structured Indexing Chapter 10: Hash-Based Indexing Chapter 11: External Sorting Chapter 12 (Part A): Evaluation of Relational Operators Chapter 12 (Part B): Evaluation of Relational Operators: Other Techniques Chapter 13: Introduction to Query Optimization Chapter 14: A Typical Relational Optimizer Chapter 15: Schema Refinement and Normal Forms Chapter 16 (Part A): Physical Database Design Chapter 16 (Part B): Database Tuning Chapter 17: Security Chapter 18: Transaction Management Overview Chapter 19: Concurrency Control Chapter 20: Crash Recovery Chapter 21: Parallel and Distributed Databases Chapter 22: Internet Databases Chapter 23: Decision Support Chapter 24: Data Mining Chapter 25: Object-Database Systems Chapter 26: Spatial Data Management Chapter 27: Deductive Databases Chapter 28: Additional Topics
Contraintes Générales: CHECK Syntaxe: CHECK conditional-expression. L’expression conditionnelle: Exprime une IC plus générale que les clés. Peut contenir des requêtes. Requiert d’être satisfait seulement lorsque la table associée est non vide. Peut être exprimée sur plusieurs tables; cependant elle est le plus souvent exprimée sur une seule table. Les contraintes CHECK peuvent être nommées: CONSTRAINT MyConstraint CHECK conditional-expression 8
Contraintes CHECK: Exemples Contrainte: Le niveau doit être entre 1 et 10 CREATE TABLE Sailors ( sid INTEGER, sname CHAR(10), rating INTEGER, age REAL, PRIMARY KEY (sid), CHECK ( rating >= 1 AND rating <= 10 )) 8
Contraintes Générales: ASSERTION Contrainte: le nombre de bateaux plus le nombre de navigateurs est < 100 CREATE TABLE Sailors ( sid INTEGER, sname CHAR(10), rating INTEGER, age REAL, PRIMARY KEY (sid), CHECK ( (SELECT COUNT (S.sid) FROM Sailors S) + (SELECT COUNT (B.bid) FROM Boats B) < 100 ) Cette solution est compliquée, voire fausse: Elle est erronément associée seulement avec Sailors, bien qu’elle implique à la fois Sailors et Boats. Si Sailors est vide, le nombre de tuples de Boats peut être arbitraire, car l’expression conditionnelle n’est pas requise d’être satisfaite dans ce cas. 9
Contraintes Générales: ASSERTION Contrainte: le nombre de bateaux plus le nombre de navigateurs est < 100 CREATE ASSERTION smallClub CHECK ( (SELECT COUNT (S.sid) FROM Sailors S) + (SELECT COUNT (B.bid) FROM Boats B) < 100 ) L’assertion n’est associée avec aucune des tables impliquées. ASSERTION est la solution adéquate pour la raison ci haut. 9
Contraintes Générales: Autres Exemples Schéma: Students(sid: int, sname: string, age: int, cgpa: real) Works(sid: int, pid: int, pct_time: int) Projects(pid: int, budget: real, ta: int) Donnez une contrainte SQL (domaine, clé, clé étrangère, ou contrainte CHECK; ou assertions) pour les exigences suivantes: Les étudiants doivent avoir un cgpa minimum de 5. Chaque TA doit aussi être un étudiant. Le pourcentage total d’assignements à des projets pour chaque étudiant doit être d’au plus 100%. Un TA doit avoir un cgpa plus élevé que celui de tout étudiant qu’il supervise. 9
Contraintes Générales:Autres Exemples (1) Contrainte: Les étudiants doivent avoir un cgpa minimum de 5. CREATE TABLE Students ( sid INTEGER, sname CHAR(10), age REAL, cgpa REAL, PRIMARY KEY (sid), CHECK (cgpa >= 5)) Constraint: Chaque TA doit aussi être un étudiant. CREATE ASSERTION TAisStudent CHECK ( (SELECT COUNT (*) FROM Projects P WHERE P.ta_id NOT IN (SELECT sid FROM Students)) =0 ) 9
Contraintes Générales: Autres Exemples (2) Contrainte: Le pourcentage total d’assignements à des projets pour chaque étudiant doit être d’au plus 100%. CREATE TABLE Works ( sid INTEGER, pid INTEGER, pct_time INTEGER, PRIMARY KEY (sid,pid), FOREIGN KEY (sid) REFERENCES Students, FOREIGN KEY (pid) REFERENCES Projects, CHECK ((SELECT COUNT (W.stid) FROM Works W GROUP BY W.stid HAVING SUM(pct_time) > 100) = 0) 9
Contraintes Générales: Autres Exemples (3) Contrainte: Un TA doit avoir un cgpa plus élevé que celui de tout étudiant qu’il supervise. CREATE ASSERTION TAHigherCGPA CHECK ((SELECT COUNT(S.stid) FROM Students S, Students TA, Works W, Projects P WHERE S.sid=W.sid AND W.pid=P.pid AND P.ta=TA.sid AND S.cgpa > TA.cgpa) =0) 9
Triggers Trigger: procédure qui exécute automatiquement si des changements spécifiés surviennent dans la base de données. Il comportent trois partie: Événement (active le trigger) Condition (teste si le trigger devrait être exécuté) Action (ce qui survient si le trigger est exécuté)
Triggers BEFORE trigger: action exécuté avant que l’événement activant ne survienne. AFTER trigger: action exécuté après que l’événement activant ne survienne. INSTEAD trigger: action exécuté en lieu et place de l’événement activant. Trigger à exécution par ligne (Row-level trigger): exécuté une seule fois pour chaque tuple modifié (qui satisfait la condition du trigger). Trigger à exécution par commande (Statement-level trigger): exécuté une seule fois pour chaque commande. Variable de transition: NEW, OLD, NEW TABLE, OLD TABLE.
Triggers: Exemple (SQL:92) Incrémentez un compteur pour chaque navigateur nouvellement dont l’age < 18. CREATE TRIGGER incr_count AFTER INSERT ON Sailors WHEN (new.age < 18) FOR EACH ROW BEGIN count:=count+1; END Illustre l’usage de NEW pour referer à des tuples nouvellement insérés Existe depuis SQL:92
Résumé SQL permet la spécification de contraintes d’intégrité. Les triggers répondent aux changements dans la base de données.