CONTRAINTES D INTÉGRITÉ

Documents pareils
Langage propre à Oracle basé sur ADA. Offre une extension procédurale à SQL

Les Triggers SQL. Didier DONSEZ. Université de Valenciennes Institut des Sciences et Techniques de Valenciennes

TP Contraintes - Triggers

Module Administration BD Chapitre 1 : Surcouche procédurale dans les SGBDS

Administration des bases de données

Bases de Données relationnelles et leurs systèmes de Gestion

Intégrité des données

Intégrité sémantique dans les bases de données relationnelles

COMMANDES SQL... 2 COMMANDES DE DEFINITION DE DONNEES... 2

Le Langage De Description De Données(LDD)

Langage SQL : créer et interroger une base

Bases de données avancées

ECR_DESCRIPTION CHAR(80), ECR_MONTANT NUMBER(10,2) NOT NULL, ECR_SENS CHAR(1) NOT NULL) ;

Cours Bases de données 2ème année IUT

Partie I : Créer la base de données. Année universitaire 2008/2009 Master 1 SIIO Projet Introduction au Décisionnel, Oracle

Cours Bases de données 2ème année IUT

1. Qu'est-ce que SQL? La maintenance des bases de données Les manipulations des bases de données... 5

ORACLE 10G DISTRIBUTION ET REPLICATION. Distribution de données avec Oracle. G. Mopolo-Moké prof. Associé UNSA 2009/ 2010

Administration des bases de données. Jean-Yves Antoine

Cours 3. Développement d une application BD. DBA - Maîtrise ASR - Université Evry

Olivier Mondet

Partie II Cours 3 (suite) : Sécurité de bases de données

Bases de données Oracle Virtual Private Database (VPD) pour la gestion des utilisateurs d applications

INTEGRITE ET BD ACTIVES

Devoir Data WareHouse

Laboratoires de bases de données. Laboratoire n 6. Programmation SQL. par Danièle BAYERS et Louis SWINNEN

Auto-évaluation Oracle: cours de base

Gestion des utilisateurs et de leurs droits

Licence de MIDO - 3ème année Spécialités Informatique et Mathématiques Appliquées

Plan. Bases de Données. Sources des transparents. Bases de SQL. L3 Info. Chapitre 4 : SQL LDD Le langage de manipulation de données : LMD

Corrigés détaillés des exercices

Notes de cours : bases de données distribuées et repliquées

A QUOI SERVENT LES BASES DE DONNÉES?

Langage SQL (1) 4 septembre IUT Orléans. Introduction Le langage SQL : données Le langage SQL : requêtes

TP3 : Creation de tables 1 seance

Le Langage SQL version Oracle

1 Position du problème

Le langage SQL pour Oracle - partie 1 : SQL comme LDD

Bases de données et sites WEB

Compétences Business Objects

Gestion de base de données

Bases de Données Avancées PL/SQL

Historisation des données

SQL Historique

Introduction au PL/SQL Oracle. Alexandre Meslé

Encryptions, compression et partitionnement des données

Bases de données et sites WEB Licence d informatique LI345

Présentation Windows Azure Hadoop Big Data - BI

Procédures Stockées WAVESOFT ws_sp_getidtable Exemple : ws_sp_getnextsouche Exemple :... 12

ISC Système d Information Architecture et Administration d un SGBD Compléments SQL

Introduction au Système de Gestion de Base de Données et aux Base de Données

1. Base de données SQLite

MySQL / SQL EXEMPLES

Partie 0 : Gestion des tablespace et des utilisateurs... 3

OpenPaaS Le réseau social d'entreprise

Le langage SQL (première partie) c Olivier Caron

Chapitre 10. Architectures des systèmes de gestion de bases de données

SQL sous SqlServer OLIVIER D. DEHECQ Olivier 0

A QUOI SERVENT LES BASES DE DONNÉES?

//////////////////////////////////////////////////////////////////// Administration bases de données

Bases de données relationnelles

16H Cours / 18H TD / 20H TP

Création et Gestion des tables

TD : Requêtes SQL (BDR.TD2-1) INSA 3IF

Pour les débutants. langage de définition des données

Les bases de données

Gestion des transactions et accès concurrents dans les bases de données relationnelles

FileMaker 13. Guide de référence SQL

PHP 5. La base de données MySql. A. Belaïd 1

Cours SQL. Base du langage SQL et des bases de données

A.E.C. GESTION DES APPLICATIONS TECHNOLOGIE DE L'INFORMATION LEA.BW

Support de cours «SGBD»

Bases de Données Réparties Concepts et Techniques. Matthieu Exbrayat ULP Strasbourg - Décembre 2007

CHAPITRE 4 POLITIQUES DE CONTRÔLES DES ACCÈS SOUS ORACLE ADMINISTRATION ET TUNING DE BASES DE DONNÉES 10/05/2015 RESPONSABLE DR K.

Chapitre 3 LE MODELE RELATIONNEL ET SQL (DDL)

Résumé S Q L. Auteur: Alexandre PATIN Edition: 22 février alexandre.patin@free.fr URL :

CREATION WEB DYNAMIQUE

Introduction à JDBC. Accès aux bases de données en Java

Introduction aux Bases de Données 2004/2005

I. MySQL : Serveur et SGBD

Chapitre 5 : Les procédures stockées PL/SQL

14/04/2014. un ensemble d'informations sur un sujet : exhaustif, non redondant, structuré, persistant. Gaëlle PERRIN SID2 Grenoble.

LE LANGAGE SQL2 1. INTRODUCTION

Java DataBaseConnectivity

Table des matières PRESENTATION DU LANGAGE DS2 ET DE SES APPLICATIONS. Introduction

Plan Général Prévisionnel (1/2) (non contractuel) Internet et Outils L1/IO S2-IO2 Bases de données: Jointures, Transactions

Optimisation SQL. Quelques règles de bases

AGRÉGATION «ÉCONOMIE ET GESTION»

Java et les bases de données: JDBC: Java DataBase Connectivity SQLJ: Embedded SQL in Java. Michel Bonjour

Paginer les données côté serveur, mettre en cache côté client

Systèmes de Gestion de Bases de Données

Bases de données. Mihaela Mathieu

Quelques aspects du Relationnel-Objet du SGBD Oracle

Mysql. Les requêtes préparées Prepared statements

BTS/CGO P10 SYSTEME INFORMATION Année

BASES DE DONNEES TP POSTGRESQL

SQL. Oracle. pour. 4 e édition. Christian Soutou Avec la participation d Olivier Teste

PL langage de programmation côté serveur. SQL à la base : types, expressions, requêtes

Transcription:

Université des sciences et de la Technologie Houari Boumediene USTHB Alger Département d Informatique MASTER SYSTÈMES INFORMATIQUES INTELLIGENTS MASTER INFORMATIQUE VISUELLE MASTER ARCHITECTURES PARALLÈLES ET CALCUL INTENSIF ENSEIGNANT : M. KAMEL BOUKHALFA CONTRAINTES D INTÉGRITÉ Les données de la base doivent rester conformes à la réalité qu elle représente Solution : Définition des contraintes d intégrité (CI). Deux types Contraintes d intégrité statiques : celles qui correspondent à un prédicat sur l état courant de la base. Contraintes d intégrité dynamiques : celles qui concernent le passage d un état à un autre. A tout instant de l existence d une base de données, on doit pouvoir définir une nouvelle contrainte d intégrité. 1

CONTRAINTES STATIQUES Unicité de la clé CI individuelles Plage de valeurs : 4.000 salaire 20.000, Liste de valeurs : Couleur dans [bleu, rouge, vert, jaune] Contraintes entre constituants : QTE-STOCK QTE- COMMANDE Contraintes de format : NOM CHAR(20) L instruction ASSERT L INSTRUCTION ASSERT ASSERT <nom assertion> [on relation] : prédicat ; ASSERT CI1 ON PIECE : MATERIAU IN ( fer, bronze, zinc, plomb ) ; SQL 99 CREATE ASSERTION <Constraint name> CHECK (search condition) [ <constraint attributes> ] Exemple 1 CREATE ASSERTION constraint_1 CHECK ((SELECT AVG (Salaire) FROM Employe >40 000)) CREATE ASSERTION constraint_1 CHECK (0 <> (SELECT COUNT(*) FROM Table_1)); Exemple 2 Create Assertion CityCheck Check ( NOT EXISTS ( Select * From customer Where customer_city is null)); 2

L INSTRUCTION ASSERT Le montant des commandes non réglées ne doit pas dépasser 20% du montant du chiffre d'affaire déjà réalisé par le client CREATE ASSERTION AST_VERIFACTURE CHECK (SELECT SUM(FCT_MONTANT) FROM T_FACTURE F WHERE FCT_PAYE = 0 GROUP BY CLI_ID, FCT_PAYE) < (SELECT 0.2 * (SUM(CPT_DEBIT) - SUM(CPT_CREDIT)) FROM T_COMPTE WHERE CLI_ID = F.CLI_ID) CONTRAINTES INTRA-RELATIONS Verticale Contrôler la valeur d un constituant d un n-uplet en fonction des valeurs de ce constituant pour les autres n-uplets. Horizontale Contrôler la valeur d un constituant en fonction des valeurs apparaissant dans les autres constituants Exemple : Employé(Nom, Salaire, Nom-Rayon) «Un employé ne peut gagner plus du double de la moyenne des salaires de son rayon» ASSERT CI2 ON Employé E : Salaire 2 * (SELECT AVG (Salaire) FROM Employé WHERE Nom-Rayon = E.Nom-Rayon); 3

EXEMPLE DE CONTRAINTE «Le salaire d un employé ne doit pas être supérieur au salaire du responsable du service dans lequel l employé travaille» CREATE ASSERTION contraintesalaire CHECK ( NOT EXISTS ( SELECT * FROM employe e, employe m, service d WHERE e.salaire > m.salaire AND e.nosce = d.nosce AND d.nossdir = m.noss )) ; Non disponible sous Oracle (rôle joué par les triggers). CONTRAINTES INTER-RELATIONS Contrôler que l ensemble des valeurs d un constituant d une relation R1 apparaît également dans une relation R2 Exprimer le fait que tout rayon apparaissant dans la relation Employé est décrit dans la relation Rayon ASSERT CI5 (SELECT NOM-Rayon FROM Employé) IS IN (SELECT Nom-Rayon FROM Rayon); 4

CONTRAINTES D INTÉGRITÉ DYNAMIQUES Contrôler le passage d un état à un autre. Les n-uplets du nouvel état dépendant de ceux de l ancien Exemple : le salaire d un employé ne peut diminuer ASSERT CI6 ON UPDATE OF Employé (Salaire) NEW Salaire OLD Salaire; ASSERTIONS VS. TRIGGERS Les assertions ne modifient pas les données mais vérifient seulement des conditions Les assertions ne sont pas liées à des tables spécifiques dans la BD ni à certains évènements. Les triggers vérifient des conditions et modifient les données Les triggers sont liés à des tables spécifiques et des évenements déclencheurs Toutes les assertions peuvent être implémentées par des Triggers, le contraire n est pas toujours possible. Les assertions ne sont pas supportées dans tous les SGBD (Oracle par exemple) 5

LES TRIGGERS Trigger = action spontanée Exemple Lorsqu un nouvel employé est inséré dans la base, le nombre d employés figurant dans la relation rayon doit augmenter de un pour le rayon du nouvel employé DEFINE TRIGGER EMPINS AFTER INSERT ON Employé (UPDATE RAYON SET Nb-Employés = Nb-Employés + 1 WHERE Nom-Rayon = NEW Employé.Nom-Rayon); CRÉATION DE TRIGGERS CREATE TRIGGER Nom_Trigger BEFORE DELETE OR INSERT OR UPDATE ON Nom_Table FOR EACH ROW WHEN (new.empno>0) DECLARE... <<<<déclarations>>>> BEGIN... <<<< bloc d'instructions PL/SQL>>>> END; 6

LE NOM DU TRIGGER Doit être unique dans un même schéma Peut être le nom d'un autre objet (table, vue, procédure) mais à éviter Option BEFORE/AFTER Elle précise le moment de l'exécution du trigger DÉFINITION DU TRIGGER Elle comprend le type d'instruction SQL qui déclenche le trigger : DELETE, INSERT, UPDATE On peut en avoir une, deux ou les trois. Pour UPDATE, on peut spécifier une liste de colonnes. Dans ce cas, le trigger ne se déclenchera que si l'instruction UPDATE porte sur l'une au moins des colonnes précisée dans la liste. S'il n'y a pas de liste, le trigger est déclenché pour toute instruction UPDATE portant sur la table. 7

TYPES DE TRIGGERS Le type d un trigger détermine : quand ORACLE déclenche le trigger, combien de fois ORACLE déclenche le trigger. Le type du trigger est défini par l utilisation de l une ou l autre des options suivantes : BEFORE, AFTER, FOR EACH ROW ORACLE propose deux types de triggers les triggers lignes qui se déclenchent individuellement pour chaque ligne de la table affectée par le trigger, les triggers globaux qui sont déclenchées une seule fois. Si l'option FOR EACH ROW est spécifiée, c'est un trigger ligne, sinon c'est un trigger global. TRIGGERS LIGNES On peut introduire une restriction sur les lignes à l'aide d'une expression logique SQL : c'est la clause WHEN : Cette expression est évaluée pour chaque ligne affectée par le trigger. Le trigger n'est déclenché sur une ligne que si l'expression WHEN est vérifiée pour cette ligne. L'expression logique ne peut pas contenir une sous-question. Par exemple, WHEN (new.empno>0) empêchera l'exécution du trigger si la nouvelle valeur de EMPNO est 0, négative ou NULL. 8

CORPS DU TRIGGER Le corps du trigger est un bloc PL/SQL Il peut contenir du SQL et du PL/SQL. Il est exécuté si l'instruction de déclenchement se produit et si la clause de restriction WHEN, le cas échéant, est évaluée à vrai. NOMS DE CORRÉLATION La nouvelle valeur est appelée L'ancienne valeur est appelée :new.colonne :old.colonne Exemple : IF :new.salaire < :old.salaire... Si un trigger ligne BEFORE modifie la nouvelle valeur d'une colonne, un éventuel trigger ligne AFTER déclenché par la même instruction voit le changement effectué par le trigger BEFORE. 9

L'OPTION REFERENCING Si une table s'appelle NEW ou OLD, on peut utiliser REFERENCING pour éviter l'ambiguïté entre le nom de la table et le nom de corrélation. Exemple CREATE TRIGGER nomtrigger BEFORE UPDATE ON new REFERENCING new AS newnew FOR EACH ROW BEGIN :newnew.colon1:= TO_CHAR(:newnew.colon2); END; LES PRÉDICATS CONDITIONNELS INSERTING, DELETING ET UPDATING Quand un trigger comporte plusieurs instructions de déclenchement (par exemple INSERT OR DELETE OR UPDATE), on peut utiliser des prédicats conditionnels (INSERTING, DELETING et UPDATING) pour exécuter des blocs de code spécifiques pour chaque instruction de déclenchement. Exemple CREATE TRIGGER... BEFORE INSERT OR UPDATE ON employe... BEGIN... IF INSERTING THEN... END IF; IF UPDATING THEN... END IF; END; 10

OPTION UPDATING UPDATING peut être suivi d'un nom de colonne CREATE TRIGGER... BEFORE UPDATE OF salaire, commission ON employe... BEGIN... IF UPDATING ('salaire') THEN... END IF;... END; ORDRE DE TRAITEMENT DES LIGNES On ne peut pas gérer l'ordre des lignes traitées par une instruction SQL. On ne peut donc pas créer un trigger qui dépend de l'ordre dans lequel les lignes sont traitées. Triggers en cascade Un trigger peut provoquer le déclenchement d'un autre trigger. ORACLE autorise jusqu'à 32 triggers en cascade à un moment donné. 11

CONDITIONS NÉCESSAIRES POUR CRÉER UN TRIGGER Il faut avoir le privilège CREATE TRIGGER Il faut soit posséder la table sur laquelle on veut définir un trigger, soit posséder le privilège ALTER sur la table sur laquelle on veut définir le trigger, soit posséder le privilège ALTER ANY TABLE Modification de triggers Pour modifier un trigger, on refait une instruction CREATE TRIGGER suivie de OR REPLACE ou bien on supprime le trigger (DROP TRIGGER nomtrigger) et on le crée à nouveau. ACTIVATION D UN TRIGGER Un trigger peut être activé ou désactivé. S il est désactivé, ORACLE le stocke mais l ignore. On peut désactiver un trigger si : il référence un objet non disponible on veut charger rapidement un volume de données important ou recharger des données déjà contrôlées. Par défaut, un trigger est activé dès sa création. Pour désactiver un trigger, on utilise l instruction ALTER TRIGGER avec l option DISABLE : ALTER TRIGGER nomtrigger DISABLE; On peut désactiver tous les triggers associés à une table avec la commande : ALTER TABLE nomtable DISABLE ALL TRIGGERS; A l inverse on peut réactiver un trigger : ALTER TRIGGER nomtrigger ENABLE; ou tous les triggers associés à une table : ALTER TABLE nomtable ENABLE ALL TRIGGERS; 12

RECHERCHE D INFORMATION SUR LES TRIGGERS Les définitions des triggers sont stockées dans les tables de la métabase, notamment dans les tables USER_TRIGGERS ALL_TRIGGERS DBA_TRIGGERS GESTION D'EXCEPTIONS Si une erreur se produit pendant l'exécution d'un trigger, toutes les mises à jour produites par le trigger ainsi que par l'instruction qui l'a déclenché sont défaites. On peut introduire des exceptions en provoquant des erreurs. Une exception est une erreur générée dans une procédure PL/SQL. Elle peut être prédéfinie ou définie par l'utilisateur. Un bloc PL/SQL peut contenir un bloc EXCEPTION gérant les différentes erreurs possibles avec des clauses WHEN. Une clause WHEN OTHERS THEN ROLLBACK; gère le cas des erreurs non prévues. 13

EXCEPTIONS PRÉDÉFINIES - QUELQUES EXEMPLES NO_DATA_FOUND : cette exception est générée quand un SELECT INTO ne retourne pas de lignes DUP_VAL_ON_INDEX : tentative d'insertion d'une ligne avec une valeur déjà existante pour une colonne à index unique ZERO_DIVIDE : division par zéro QUELQUES EXEMPLES employe(numserv,...) service(numserv,...) /* vérifier que le service de l'employé existe bien */ CREATE TRIGGER verif_service BEFORE INSERT OR UPDATE OF numserv ON employe FOR EACH ROW WHEN (new.numserv is not null) DECLARE noserv integer; BEGIN noserv:=0; SELECT numserv INTO noserv FROM SERVICE WHERE numserv=:new.numserv; IF (noserv=0) THEN raise_application_error(-20501, 'N de service non correct'); END IF; END; 14

EXEMPLES Employe (salaire,...) /* mettre une valeur par défaut si le champ ne contient rien */ /* affecter 5000 au salaire d'un employé qui n'en a pas */ CREATE TRIGGER smic BEFORE INSERT OR UPDATE OF salaire ON employe FOR EACH ROW WHEN (new.salaire is null) BEGIN SELECT 5000 INTO :new.salaire FROM employe; END; EXEMPLES employe(numemp,salaire,grade,...) grille(grade,salmin,salmax) /* vérifier le salaire d'un employé */ /* s'assurer que le salaire est compris dans les bornes correspondant au grade de l'employé */ CREATE TRIGGER verif_grade_salaire BEFORE INSERT OR UPDATE OF salaire, grade ON employe FOR EACH ROW DECLARE minsal number; maxsal number; BEGIN /* retrouver le salaire minimum et maximum du grade */ SELECT salmin,salmax INTO minsal, maxsal FROM grille WHERE grade= :new.grade; /* s'il y a un problème, on provoque une erreur */ IF (:new.salaire<minsal OR :new.salaire>maxsal) THEN raise_application_error (- 20300,'Salaire TO_CHAR (:new.salaire) 'incorrect pour ce grade'); EXCEPTION WHEN no_data_found THEN raise_application_error(-20301,'grade incorrect'); END; 15