Le Langage de Contrôle de Données TRIGGERS

Slides:



Advertisements
Présentations similaires
PL/SQL : Le Langage PL/SQL est une extension du SQL, qui offre
Advertisements

Les Systèmes de Gestion de Bases de Données (SGBD) PL-SQL.
Les Systèmes de Gestion de Bases de Données (SGBD) Les vues.
Vues.
Programmation dapplication INT. 2 Bases de Données Plan du document Contexteslide 1 Programmer avec une BDslide 2 Client-Serveur SQL et architecture 3.
INTEGRITE ET BD ACTIVES
Année universitaire Système dinformation Le SQL (Structured Query Language) langage dinterrogation dune base de données.
LE LANGAGE SQL : LDD La création de tables L’ordre CREATE CREATE TABLE nom_de_table (Nom_colonne Type_colonne, Nom_colonne Type_colonne,
AYARI Mejdi Formation 2121 * ISD * 1 tructured uery Anguage 2006.
10 Copyright © Oracle Corporation, Tous droits réservés. Autres concepts relatifs aux déclencheurs.
Connexion en mode application. Bases de données - Yann Loyer2 Connexion en mode application Pour tout type dutilisateurs : –passif, actif, gérant Permettre.
L’utilisation des bases de données
F Copyright © Oracle Corporation, Tous droits réservés. Créer des programmes avec Procedure Builder.
EPID-CPI-ISAIP Philippe Bancquart - mise à jour 24/02/ page 1 Procédures stockées CPI-SQLServer.
PLSQL ORACLE 8i Connecter VB à BD Oracle Les collections Question de révision Les blocs anonymes Les triggers REVISION Par : Joël Huot.
SQL: Contraintes et Triggers
Bases de Données Avancées - TP2: SQL
PL/SQL Noreddine GHERABI 1.
Christine Bonnet SOURCES : « Samples » dOracle, « Oracle 8 » R. Chapuis PRO*C – C ++
Les transactions.
Procédures Stockées Schedule: Timing Topic 60 minutes Lecture
SQL Partie 2. SQL est un Langage de Manipulation de Données SQL est un langage de manipulation de données (LMD), cela signifie qu'il permet de sélectionner,
EPID-CPI-ISAIP Philippe Bancquart - mise à jour 24/02/ page 1 Transac SQL Intégrité des données.
Le Langage de BLOC PL/SQL
JDBC L'API JDBC est utilisée pour utilisée pour intéragir avec une base de données.
Créer des déclencheurs de base de données
Créer des packages.
A L I M E N T A T I O N A G R I C U L T U R E E N V I R O N N E M E N T Réseau BD 11/12/08 Fonctionnalités et limites d’outils d’indexation et de recherche.
INTEGRITE ET BD ACTIVES
 C'est une fenêtre par laquelle les informations d'une table peuvent être visualisées et changées.  C'est une table virtuelle: ◦ elle n'existe pas ◦
(Procedural Language / Structured Query Language)
Institut Supérieur d’Informatique
DEFINITION DES DONNEES : schéma conceptuel. Schéma conceptuel instructiondescription CREATE TABLEcréation d'une relation ALTER TABLEmodification de la.
6 Copyright © Oracle Corporation, Tous droits réservés. Autres concepts relatifs aux packages.
Module 13 : Implémentation de déclencheurs. Vue d'ensemble Présentation des déclencheurs Définition de déclencheurs Exemples de déclencheurs Performances.
Gérer les rôles.
SQL : Langage de Manipulation des données
21/04/2015© Robert Godin. Tous droits réservés.1 6Gestion des contraintes d’intégrité en SQL n Contrainte d'intégrité statique – respectée pour chacun.
Introduction  Langage propre à Oracle basé sur ADA  Offre une extension procédurale à SQL  PL/SQL permet d’utiliser un sous-ensemble du langage SQL.
Révision du langage PL/SQL
Création et Gestion de Tables
Le Langage de Définition de Données LDD
3 Copyright © Oracle Corporation, Tous droits réservés. Créer des fonctions.
4 Copyright © Oracle Corporation, Tous droits réservés. Gérer les sous-programmes.
Les vues Une vue: c’est une relation virtuelle. Définie par:
02/06/2015© Robert Godin. Tous droits réservés.1 5 Interface entre SQL et un programme n SQL incomplet n Défaut d'impédance (impedance mismatch) – modèle.
 L’information est conservée sous forme de tables  Contient: ◦ Un nom ◦ Une clé primaire ◦ Une liste de colonnes ◦ Les informations/données (sous forme.
Définition des contraintes Vérification des contraintes Triggers
PL/SQL Présentation.
Cours Access TuanLoc NGUYEN. Contact Nguyen TuanLoc Tél: Web:
Note: Les nombres écrits en gras renvoie à des leçons entières. Symbole %FOUND 6-13 %ISOPEN 6-13 %NOTFOUND 6-13 %ROWCOUNT 6-13 %ROWTYPE 5, 6-17 %TYPE 1-20.
Le Langage de Contrôle de Données LCD. 2 Contrôle des Données Notion de Sous–Schéma –Restriction de la vision –Restriction des actions Privilèges –Systèmes.
Procédures Stockées Fonctions Paquetages
Les bases de données Séance 8 Jointures.
Le Langage de Manipulation de Données LMD. 2 Les ordres SQL de manipulation INSERT –Insertion (ajout) de ligne(s) dans une table –Utiliser SQL*LOAD pour.
CHAPITRE 4 PL/SQL Langage SQL en mode procédural (PL/SQL):
Le langage SQL.
Générateur d’applications WEB de gestion de données Génération de la base de données.
NIVEAU LOGIQUE Vues. Fenêtre dynamique sur la base Ses données proviennent d'autres tables ou d'autres vues.
Nicolas Ribot Introduction aux triggers Nicolas Ribot - Licence GNU FDL - Version 1.1.
Cours n°2 Implémentation et exploitation
Introduction au langage PL/SQL
Les exceptions Une exception est un identificateur PL/SQL détecté pendant la phase d’exécution. Comment est-elle déclenchée ? À la suite d’une erreur.
Les vues, indexes, séquences.  Qu’est ce qu’une vue 1. Une vue est une vision partielle ou particulière des données d'une ou plusieurs tables de la base.
Le Langage de Manipulation de Données LMD Module 6.
SQL Partie 2. SQL est un langage de manipulation de données SQL est un langage de manipulation de données (LMD), cela signifie qu'il permet de sélectionner,
1 Les bases de données Séance 5 -- Le Langage de Définition de Données ou la manœuvre de la structure de la base -- Le Langage de Manœuvre de Données.
SQL LMD FICHE 4.6.
Transcription de la présentation:

Le Langage de Contrôle de Données TRIGGERS

Généralités sur les Triggers Programme évènementiel Bloc événement (UPDATE, DELETE, INSERT) Bloc action (bloc PL/SQL) Trois fonctions assurées Mise en place de contraintes complexes Mise à jour de colonnes dérivées Génération d’évènements Associé à une table Suppression de la table  suppression des triggers SI évènement ALORS action SINON rien FINSI

12 types de Triggers 2 2 3 "Row" Trigger ou "Statement" Trigger Row : le trigger est exécuté pour chaque ligne touchée Statement : le trigger est exécuté une fois Exécution avant ou après l’événement "before " : le bloc action est levé avant que l’événement soit exécuté "after " : le bloc action est levé après l’exécution du bloc événement Trois évènements possibles UPDATE : certaines colonnes INSERT DELETE 2 2 3

Syntaxe de création CREATE [OR REPLACE] TRIGGER <nom_trigger> {BEFORE|AFTER} {INSERT|DELETE|UPDATE [OF colonnes]} ON <nom_table> [FOR EACH ROW] [DECLARE] -- déclaration de variables, exceptions -- curseurs BEGIN -- bloc action -- ordres SQL et PL/SQL END; / row trigger si présent

Anciennes et nouvelles valeurs Pour les row trigger (triggers lignes ) : accès aux valeurs des colonnes pour chaque ligne modifiée Deux variables : :NEW.colonne et :OLD.colonne Ancienne valeur :OLD.colonne Nouvelle valeur :NEW.colonne INSERT NULL DELETE UPDATE

Trigger de contraintes : ‘lever’ une erreur Test de contraintes : erreur ou pas Ordre : RAISE_APPLICATION_ERROR N°erreur : [-20000 , -20999]  SQLCODE Texte erreur : message envoyé  SQLERRM RAISE_APPLICATION_ERROR(n°erreur,’texte erreur’)

Exemples de row trigger : prise de commande (1) produits idProd NomProd QtStock Seuil détail_commandes p1 Produit 1 20 15 P2 Produit 2 50 12 …… IdCom idProd QtCom 1001 p1 10 INSERT (2) (3) réapprovisionnement (1) Contrôle QtStock > QtCom ? (2) Mise à jour QtStock=QtStock-QtCom (3) génération évènements Ajout dans réappro si Seuil >= QtStock idProd NomProd QtStock Seuil

Prise de commande : (1) contrôle quantité en stock ? CREATE TRIGGER t_b_i_detail_commandes BEFORE INSERT ON détail_commandes FOR EACH ROW DECLARE v_qtstock NUMBER; BEGIN SELECT qtstock INTO v_qtstock FROM produits WHERE idprod = :NEW.idprod; IF v_qtstock < :NEW.qtcom THEN RAISE_APPLICATION_ERROR(-20001,’stock insuffisant’); END IF; END; /

Prise de commande : (2) Mise à jour quantité en stock CREATE TRIGGER t_a_i_detail_commandes AFTER INSERT ON detail_commandes FOR EACH ROW BEGIN UPDATE produits p SET p.qtstock = p.qtstock - :NEW.qtcom WHERE idprod = :NEW.idprod; END; /

Prise de commande : (3) génération d’un réapprovisionnement CREATE TRIGGER t_a_u_produits AFTER UPDATE OF qtstock ON produits FOR EACH ROW BEGIN IF :NEW.qtstock <= :NEW.seuil THEN INSERT INTO reapprovisionnement VALUES (:NEW.idprod,:NEW.nomprod,:NEW.qtstock, :NEW.seuil); END IF; END; /

Les prédicats dans un trigger On peut regrouper tous les triggers d’un même type : BEFORE ou AFTER On précise l’ordre dans le BEGIN CREATE TRIGGER <nom_trigger> {BEFORE|AFTER} INSERT OR DELETE OR UPDATE [OF colonnes]} ON <nom_table> [FOR EACH ROW] [DECLARE] -- déclaration de variables, exceptions BEGIN IF UPDATING(’colonne’) THEN …… END IF; IF DELETING THEN …… END IF; IF INSERTING THEN …… END IF; END; /

Limitation des Trigger Impossible d’accéder sur la table sur laquelle porte le trigger Attention aux effets de bords : exemple : trigger x1 de la table T1 fait un insert dans la table T2 qui possède un trigger x2 qui modifie T3 qui possède un trigger x3 qui modifie T1 T1 T2 T3 X1 X2 X3

Les triggers d’état ou ‘Statement trigger’ Raisonnement sur la globalité de la table et non sur un enregistrement particulier TRIGGER BEFORE : 1 action avant un ordre UPDATE de plusieurs lignes TRIGGER AFTER : 1 action après un ordre UPDATE touchant plusieurs lignes

Exemple de Statement Trigger Interdiction d’emprunter un ouvrage pendant le week-end CREATE TRIGGER controle_date_emp BEFORE UPDATE OR INSERT OR DELETE ON emprunt BEGIN IF TO_CHAR(SYSDATE,’DY’) IN (’SAT’,’SUN’) THEN  RAISE_APPLICATION_ERROR (-20102,’Désole les emprunts sont interdits le week-end...’) ; END IF; END; /

Les Triggers ‘INSTEAD OF’ Trigger faisant le travail ‘à la place de’ ….. Posé sur une vue multi-table pour autoriser les modifications sur ces objets virtuels Utilisé dans les bases de données réparties pour permettre les modifications sur le objets virtuels fragmentés (cours BD Réparties) Permet d’assurer un niveau d’abstraction élevé pour les utilisateurs ou développeurs clients : les vraies mises à jour sont faites à leur insu ….

Exemple de trigger ‘instead of’ Vue étudiant résultant de 4 tables S T A G E ETUDIANT ETUDIANT_LICENCE ETUDIANT_MASTERE ETUDIANT_DOCTORAT

Exemple de trigger ‘instead of’ Construction de la vue ETUDIANT Colonne virtuelle CREATE VIEW etudiant (ine,nom,adresse,cycle,nomstage,adstage) AS SELECT el.ine,el.nom,el.adr,’L’,s.noms,s.ads FROM etudiant_licence el, stage s WHERE el.ine=s.ine UNION SELECT em.ine,em.nom,em.adr,’M’,s.noms,s.ads FROM etudiant_mastere em, stage s WHERE em.ine=s.ine SELECT ed.ine,ed.nom,ed.adr,’D’,s.noms,s.ads FROM etudiant_doctorat ed, stage s WHERE ed.ine=s.ine;

Exemple de trigger ‘instead of’ utilisation de la vue : INSERT INSERT INTO etudiant VALUES (100,’Michel’,’Toulouse,’M’,’Oracle’,’CICT’); ETUDIANT 100 Michel Toulouse 100 Oracle CICT

Exemple de trigger ‘instead of’ trigger pour INSERT CREATE TRIGGER insert_etudiant INSTEAD OF INSERT ON etudiant FOR EACH ROW BEGIN IF :NEW.cycle=’L’ THEN INSERT INTO etudiant_licence VALUES (:NEW.ine,:NEW.nom,:NEW.adresse); INSERT INTO stage VALUES (:NEW.ine,:NEW.nomstage,:NEW.adstage); ELSIF :NEW.cycle=’M’ THEN ....... Idem pour M et D ........ ELSE RAISE_APPLICATION_ERROR (-20455,’Entrer M, L ou D’); END IF; END; /

Manipulation des Triggers Suppression d’un trigger Désactivation d’un trigger Réactivation d’un trigger Tous les triggers d’une table DROP TRIGGER <nomtrigger> ; ALTER TRIGGER <nomtrigger> DISABLE; ALTER TRIGGER <nomtrigger> ENABLE; ALTER TABLE <nomtable> {ENABLE|DISABLE} ALL TRIGGERS;

Dictionnaire des Données USER_TRIGGERS TRIGGER_NAME VARCHAR2(30) TRIGGER_TYPE VARCHAR2(16) TRIGGERING_EVENT VARCHAR2(227) TABLE_OWNER VARCHAR2(30) BASE_OBJECT_TYPE VARCHAR2(16) TABLE_NAME VARCHAR2(30) COLUMN_NAME VARCHAR2(4000) REFERENCING_NAMES VARCHAR2(128) WHEN_CLAUSE VARCHAR2(4000) STATUS VARCHAR2(8) DESCRIPTION VARCHAR2(4000) ACTION_TYPE VARCHAR2(11) TRIGGER_BODY LONG

Dictionnaire des Données (suite) USER_TRIGGER_COLS TRIGGER_OWNER VARCHAR2(30) TRIGGER_NAME VARCHAR2(30) TABLE_OWNER VARCHAR2(30) TABLE_NAME VARCHAR2(30) COLUMN_NAME VARCHAR2(4000) COLUMN_LIST VARCHAR2(3) COLUMN_USAGE VARCHAR2(17)