Contraintes d intégrité

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

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

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

TP Contraintes - Triggers

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

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

Bases de données avancées

Intégrité des données

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

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

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

Le langage procédural PL-PGSQL

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

Introduction au PL/SQL Oracle. Alexandre Meslé

Olivier Mondet

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

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

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

Corrigés détaillés des exercices

Langage SQL : créer et interroger une base

Le Langage De Description De Données(LDD)

Bases de Données Avancées PL/SQL

Bases de données relationnelles

TP3 : Creation de tables 1 seance

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

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

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

Gestion de base de données

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

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

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

SQL Historique

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

Création et Gestion des tables

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

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

Compétences Business Objects

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

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

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

Devoir Data WareHouse

Historisation des données

BASES DE DONNEES TP POSTGRESQL

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

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

Bases de données et sites WEB

A QUOI SERVENT LES BASES DE DONNÉES?

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

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

INTEGRITE ET BD ACTIVES

OpenPaaS Le réseau social d'entreprise

1 Position du problème

INSTITUT NATIONAL DES TELECOMMUNICATIONS CONTROLE DES CONNAISSANCES. 2. Les questions sont indépendantes les unes des autres.

Auto-évaluation Oracle: cours de base

A QUOI SERVENT LES BASES DE DONNÉES?

CREATION WEB DYNAMIQUE

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

Les bases de données

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

Master Exploration Informatique des données DataWareHouse

Oracle Le langage procédural PL/SQL

Le Langage SQL version Oracle

Chapitre 3 LE MODELE RELATIONNEL ET SQL (DDL)

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

Administration des bases de données

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

Java Licence Professionnelle CISII,

Bases de données. Mihaela Mathieu

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

Présentation Windows Azure Hadoop Big Data - BI

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

Comprendre les bases de données

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

Django et PostgreSQL sous la charge

I4 : Bases de Données

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

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

1. Base de données SQLite

NFA 008. Introduction à NoSQL et MongoDB 25/05/2013

Bases de Données Réparties

PROJET 1 : BASE DE DONNÉES REPARTIES

SQL sous SqlServer OLIVIER D. DEHECQ Olivier 0

PHP et mysql. Code: php_mysql. Olivier Clavel - Daniel K. Schneider - Patrick Jermann - Vivian Synteta Version: 0.9 (modifié le 13/3/01 par VS)

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

UML et les Bases de Données

Quelques aspects du Relationnel-Objet du SGBD Oracle

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

MySQL / SQL EXEMPLES

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

Java DataBaseConnectivity

BTS/CGO P10 SYSTEME INFORMATION Année

Hala Skaf-Molli. Nancy-Université 14 mai 2007

Réplication E-maj Foreign Data Wrapper PostGIS PostgreSQL-f

Support de cours «SGBD»

Vues: définition. Vues: avantages. Vues: inconvénients. Vues: exemple. Vues: syntaxe 08/12/2009

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

Application web de gestion de comptes en banques

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

Transcription:

Contraintes d intégrité - domaines - triggers - PL/SQL A. Zemmari 1 Contraintes d intégrité Les SGBD permettent de gérer plusieurs types de contraintes Les contraintes déjà vues : Clé primaire Primary Key Clé étrangère Foreign key Clé secondaire Unique Valeurs non nulles Autres types de contraintes : Domaines Contraintes sur les valeurs des attributs Contraintes sur les tuples d une table Assertions Les triggers 2 1

Domaines Soit la table Cours(NumC, Semestre, Nbr_inscrits) On veut que l attribut semestre soit de la forme SEM1 ou SEM2 par exemple, le premier semestre de 2001 sera saisi SEM101. CREATE DOMAIN SEM CHECK ((VALUE LIKE SEM1 ) OR (VALUE LIKE SEM2 )) CREATE TABLE Cours( NumC Integer, Semestre SEM, Nbr_inscrits Integer) 3 Contraintes sur les attributs(1) La contrainte précédente peut être exprimée par la clause CHECK CREATE TABLE Cours( NumC Integer, Semestre CHAR(6) CHECK( (Semestre LIKE SEM1 ) OR (Semestre LIKE SEM2 )), Nbr_Inscrits Integer ) 4 2

Contraintes sur les attributs(2) On pourrait penser que ces contraintes peuvent exprimer les clés étrangères R(A,B) S(B,C) CREATE TABLE R ( A integer, B integer Check ( B IN (Select B FROM S)) ) Cette manière de faire permet de vérifier les insertions dans R mais ne réagit pas lors des suppressions dans S 5 Contraintes sur les tuples Une contrainte peut porter sur plusieurs attributs d un même tuple Personne (Nom, Sexe, Age) ( M. Dupont, M,40), ( Mme. Dupont, F,NULL), ( Mlle. Dupont, F,20) Le nom d une femme ne doit pas commencer par M. CREATE TABLE Personne( Nom VARCHAR(30), Sexe CHAR(1) CHECK (Sexe IN ( M, F )), Age Integer, CHECK ((Sexe = M ) OR ( NOM NOT LIKE M.% )) ) 6 3

Nommer les contraintes Il est conseillé de donner des noms aux contraintes pour ensuite pouvoir y faire référence CREATE TABLE T( C INTEGER CONSTRAINT CC CHECK (Version1), ) ALTER TABLE T DROP CONSTRAINT CC; ALTER TABLE T ADD CONSTRAINT CC CHECK(Version2) 7 Les assertions(1) Les assertions sont des contraintes qui peuvent porter sur plusieurs tables. Elles doivent être vérifiées par le SGBD à chaque fois qu une des tables mentionnées est modifiée CREATE ASSERTION <nom> CHECK (<condition>) La condition doit être vraie lors de la création, sinon l assertion n est pas créée. 8 4

Les assertions(2) Cours(NumC, Sem, Nb_inscrits) Inscription(NumEt, NumC, Sem) On veut que Nb_inscrits reflète exactement le nombre d inscrits CREATE ASSERTION NB_INSCR CHECK( NOT EXISTS(select * from Cours C where C.Nb_inscrits!= (select COUNT(*) FROM Inscription i WHERE i.numc=c.numc AND i.sem=c.sem GROUP BY (i.numc, i.sem)) ) ); SET ASSERTION NB_INSCR DEFERRED; 9 Les Triggers Assertions Les assertions décrivent des contraintes qui doivent être satisfaites par la base à tout moment. Une assertion est vérifiée par le SGBD à chaque fois qu une des tables qu elle mentionne est modifiée Si une assertion est violée, alors la modification est rejetée Triggers Les triggers spécifient explicitement à quel moment doivent-ils être vérifiés (i.e. INSERT, DELETE, UPDATE) Les triggers sont des règles ECA : Evénement, Condition, Action Quand E a lieu, si C est vérifiée alors A est exécutée 10 5

Triggers activation Un trigger peut être activé BEFORE/AFTER/INSTEAD OF un événement d activation qui peut être une des commandes INSERT/DELETE/UPDATE dans une ou plusieurs tables L action peut faire référence à l ancienne et/ou à la nouvelle valeur des tuples insérés/supprimés/modifiés par l action. CREATE TRIGGER exemple1 AFTER UPDATE OF solde ON compte La condition est exprimée par la clause WHEN WHEN (solde < 0) La clause WHEN peut être n importe quelle condition booléenne. 11 Trigger - Action Le concepteur a le choix entre spécifier l action à exécuter soit Une fois, pour chaque tuple modifié/inséré/supprimé, ou Une fois pour tous les tuples modifiés lors d une seule opération FOR EACH ROW UPDATE compte SET date_débit = SYSDATE WHERE Compte.IdC = :old.idc L action peut être n importe quel code écrit dans le langage associé du SGBD sous PostgreSQL, c est PL/pgSQL, PL/PHP, PL/Java sous Oracle, c est PL/SQL, Java, C 12 6

Triggers - row level Les insertions créent de nouveaux tuples On ne peut faire référence à l ancienne valeur Les modifications font passer de old à new On peut faire référence à ces deux valeurs Avec les suppressions, on ne peut faire référence aux nouvelles valeurs. Les nouvelles/anciennes valeurs ne peuvent être accédées qu en mode ligne (Row level). 13 Exemple CREATE TRIGGER Trig_Inscrits After INSERT ON INSCRPTION FOR EACH ROW //pour chaque nouvel inscrit Update Cours SET Nb_Inscrits=Nb_Inscrits+1 where Cours.Sem=:new.Sem AND Cours.NumC=:new.Numc; 14 7

Exemple On veut garder la trace des opérations effectuées par les utilisateurs CREATE TRIGGER TRIG_INSC AFTER INSERT ON Inscrits Insert into tab_logs(utilisateur, operation, heure) values (USER, insertion, SYSDATE); 15 Triggers: Activation Activation BEFORE la condition WHEN est testée sur l état avant l arrivée de l événement déclencheur Si la condition est vraie, l action est exécutée, ensuite L événement déclencheur est réalisé INSTEAD OF l action est exécutée si la condition est vérifiée, L événement déclencheur n est jamais effectué. AFTER l action est exécutée si la condition WHEN est vérifiée après la réalisation de l événement déclencheur. 16 8

Exemples CREATE TRIGGER compter BEFORE INSERT ON Emp DECLARE nombre number; select COUNT(*) into nombre from EMP; dbms_output.put( On passera de' :nombre); dbms_output.put( a ' :nombre+1); / 17 Exemples CREATE TRIGGER compte AFTER INSERT ON Emp DECLARE nombre number; select COUNT(*) into nombre from EMP; dbms_output.put( On est passé de' :nombre-1); dbms_output.put( a ' :nombre); / 18 9

Exemples CREATE TRIGGER compte AFTER INSERT ON Emp WHEN ((select COUNT(*) from EMP)=101) dbms_output.put( On vient de passer le cap ); dbms_output.put( de 100 employés ); / 19 Exemple Emp(Nom, Salaire) Le salaire d un employé ne peut baisser. Cette contrainte ne peut être prise en compte qu en utilisant les triggers ou bien les procédure stockées. CREATE PROCEDURE mod_sal(in nome, in sale) a:=select Salaire from Emp where Nom=:nomE; si Salaire < sale alors update Emp set Salaire = :sale where Nom= :nome; 20 10

Exemple CREATE TRIGGER Mod_Sal AFTER UPDATE OF Emp ON Salaire FOR EACH ROW If :new.salaire < :old.salaire then Rollback; 21 Conception des triggers Ne pas utiliser les triggers pour gérer des contraintes qui sont facilement gérables par le système. Exemple : prise en compte des contraintes d unicité de clé. Limiter la taille des triggers. S il vous faut plus de 60 lignes, il est préférable de définir une procédure stockée et l appeler par le trigger. Utiliser les triggers pour les opérations qui ne dépendent pas de l utilisateur ni de l application Eviter les triggers récursifs. E.g, un trigger déclenché lors d une modification de la table employé et dont l action va elle aussi modifier cette table 22 11

Procédures et fonctions stockées Le langage PL/SQL Structure d'un programme PL/SQL DECLARE declarations instructions 23 Procédures et fonctions stockées Le langage PL/SQL (2) section DECLARE : sert à des déclarer des variables d'un type SQL (integer, varchar,...). Les paramètres de fonction peuvent ainsi être redéclarés avec un nom en utilisant la syntaxe ALIAS Exemple : CREATE FUNCTION prix_reduit(numeric) RETURNS numeric AS DECLARE prix ALIAS FOR $1; RETURN prix * 0.75; 24 12

Procédures et fonctions stockées Le langage PL/SQL (3) Une façon très simple est d'utiliser %TYPE pour utiliser le type d'un champ de table connu. Le suffixe %ROWTYPE est utilisé pour déclarer une variable du type "ligne d'une table". Le type record est utilisé pour contenir n'importe quelle ligne d'une requête. Exemple : DECLARE madate commandes.date%type; unecommande commande%rowtype; nimporte RECORD;... 25 Alternatives La syntaxe générale est de la forme : IF... THEN... ELSIF... THEN... ELSIF... THEN... ELSE... END IF ; Les sections ELSE et ELSIF sont optionnelles. Exemple : DECLARE prix ALIAS FOR $1; IF prix < 150 THEN RETURN 0; ELSIF prix < 500 THEN RETURN 0.02; ELSIF prix < 1500 THEN RETURN 0.05; ELSE RETURN 0.10; END IF; 26 13

Itérations PL/SQL offre la possibilité d'écrire des boucles à l'aide d'instructions LOOP, WHILE ou FOR. LOOP : Syntaxe : LOOP instructions EXIT WHEN expression END LOOP ; 27 Itérations PL/SQL offre la possibilité d'écrire des boucles à l'aide d'instructions LOOP, WHILE ou FOR. FOR : Exemples : FOR i IN 1..10 LOOP RAISE NOTICE 'i is %', i; END LOOP; FOR ligne IN requête LOOP instructions END LOOP; 28 14

instructions complémentaires RAISE EXCEPTION lance une exception avec un message d'erreur. La fonction s'arrête à cet endroit. RAISE NOTICE envoie un message sur la sortie standard. SELECT INTO permet de stocker le résultat d'un select dans une variable. FOUND est une variable prédéfinie qui vaut vrai si le select into a trouvé un enregistrement. 29 Exemple jouet On veut archiver toutes les commandes d'un mois donné, qui n'est pas le mois en cours, dans une table d'archive. CREATE TABLE archivescommandes( numcommande INTEGER PRIMARY KEY, numclient INTEGER REFERENCES clients, montant NUMERIC); Pour cela on doit: Vérifier que le mois en cours n'est pas le mois pour lequel l'archive est demandée. Calculer les montants de ces commandes Ajouter des éléments pour chacune de ces commandes dans la table prévue à cet effet : archivescommandes Supprimer toutes les lignes de procom et commandes correspondantes. 30 15

Exemple jouet (2) Solution : DECLARE moisarchive ALIAS FOR $1; anneearchive ALIAS FOR $2; com commandes%rowtype; IF anneearchive = EXTRACT(YEAR FROM now())and moisarchive = EXTRACT(MONTH FROM now()) THEN RAISE EXCEPTION 'Impossible d'archiver le mois en cours'; ELSE FOR com IN SELECT * FROM commandes WHERE anneearchive = EXTRACT(YEAR FROM date) AND moisarchive = EXTRACT(MONTH FROM date) LOOP INSERT INTO archivescommandes VALUES(com.numcommande,com.refclient,com.date,montantcommande(com.numcommande)); DELETE FROM procom WHERE refcommande = com.numcommande; DELETE FROM commandes WHERE numcommande=com.numcommande; END LOOP; END IF; RETURN; 31 16