Triggers Introduction à PL-SQL Céline Rouveirol. d'après les transparents de Jeff Ullman http://infolab.stanford.edu/~ullman/



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

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

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

Bases de données avancées

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

Devoir Data WareHouse

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

Bases de Données Avancées PL/SQL

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

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

Introduction au PL/SQL Oracle. Alexandre Meslé

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

Intégrité des données

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

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

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

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

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

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

Administration des bases de données

Corrigés détaillés des exercices

Bases de données relationnelles

A QUOI SERVENT LES BASES DE DONNÉES?

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

Configurer la supervision pour une base MS SQL Server Viadéis Services

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

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

Les déclencheurs. Version 1.0. Grégory CASANOVA

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

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

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

Gestion de base de données

Langage SQL : créer et interroger une base

Olivier Mondet

Historisation des données

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

AGRÉGATION «ÉCONOMIE ET GESTION»

CREATION WEB DYNAMIQUE

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

A QUOI SERVENT LES BASES DE DONNÉES?

Gestion des utilisateurs et de leurs droits

Oracle Le langage procédural PL/SQL

Compte-rendu de projet de Système de gestion de base de données

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

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

Le langage procédural PL-PGSQL

BASES DE DONNEES TP POSTGRESQL

Bases de données et sites WEB

Attaques applicatives

Bases de Données Réparties

Le Langage SQL version Oracle

CATALOGUE FORMATIONS DOMAINE Bases de données

MS SQL Express 2005 Sauvegarde des données

INTEGRITE ET BD ACTIVES

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

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

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

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

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

Développement d applications avec les bases de données

Mysql avec EasyPhp. 1 er mars 2006

Auto-évaluation Oracle: cours de base

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

TP3 : Creation de tables 1 seance

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

Utilisation de JAVA coté Application serveur couplé avec Oracle Forms Hafed Benteftifa Novembre 2008

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

Chapitre 3 LE MODELE RELATIONNEL ET SQL (DDL)

Le Langage De Description De Données(LDD)

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

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

OpenPaaS Le réseau social d'entreprise

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

Compétences Business Objects

I. MySQL : Serveur et SGBD

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

BTS S.I.O PHP OBJET. Module SLAM4. Nom du fichier : PHPRévisionObjetV2.odt Auteur : Pierre Barais

Module Com231A - Web et Bases de Données Notion 5 : Formulaires et utilisation des Bases de Données avec PHP

Plan. Exemple: Application bancaire. Introduction. OCL Object Constraint Language Le langage de contraintes d'uml

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

APIs de table pour SQL Server

Création et Gestion des tables

1. Base de données SQLite

Présentation du PL/SQL

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

Quelques aspects du Relationnel-Objet du SGBD Oracle

Les bases de données

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

LE LANGAGE SQL2 1. INTRODUCTION

Panorama des Bases de Données

SQL Historique


Bases de SQL. Hacks 1-6 CHAPITRE UN

Cours: Administration d'une Base de Données

Introduction aux Bases de Données 2004/2005

Transcription:

Triggers Introduction à PL-SQL Céline Rouveirol d'après les transparents de Jeff Ullman http://infolab.stanford.edu/~ullman/ 1

Triggers: Motivation Les vérifications de contraintes (attribut ou n-uplet) ont des possibilités limitées Un déclencheur ( trigger en anglais) permet à l'utilisateur de spécifier quand effectuer la vérification. Il est possible d'associer à un trigger une condition et de lui faire exécuter une séquence d'instructions SQL 2

Trigger : principe A chaque trigger, on associe un évènement : un évènement sur la base de données, Exemple: insert on Vend une condition : toute expression booléenne qui s'évalue à vrai ou faux Action : un ensemble d'instructions SQL 3

CREATE TRIGGER CREATE TRIGGER <nom> Aussi: CREATE OR REPLACE TRIGGER <nom> Utile s'il existe un trigger de ce nom que vous voulez modifier. 4

Exemple de trigger Au lieu d'utiliser une contrainte de clé étrangère et de rejeter les insertions dans Vend(bar, bière, prix) avec des bières inconnues (dans la Relation Bières), un trigger peut ajouter cette bière dans Bières, avec une couleur et une origine à NULL. 5

Exemple: Définition d'un trigger CREATE TRIGGER BièreTrig L'évènement AFTER INSERT ON Vend REFERENCING NEW AS NTuple FOR EACH ROW La condition WHEN (NTuple.bière NOT IN (SELECT nom FROM Bières)) BEGIN INSERT INTO Bières(nom) VALUES(:NTuple.bière); L'action END; 6

Triggers: partie condition AFTER ou BEFORE. INSTEAD OF, si la relation est une vue. Une façon de modifier une vue : avoir un trigger qui effectue les modifications appropriées sur les tables de base INSERT, DELETE, UPDATE, UPDATE ON <nom d'attributs> 7

Triggers: FOR EACH ROW Les triggers sont soit row-level ou statement-level. FOR EACH ROW précise que le trigger est row-level; son absence indique que le trigger est statement-level Les triggers row level sont exécutés à chaque modification de nuplets, pour chaque n-uplet modifié. Les triggers statement-level sont exécutés une fois pour toute à chaque modification, quelque soit le nombre de nuplets modifiés. 8

Trigger statement level: exemple CREATE OR REPLACE TRIGGER emp_alert_trig BEFORE INSERT ON employé BEGIN DBMS_OUTPUT.PUT_LINE( Ajout employé(s)'); END; INSERT INTO employé (emp_id, emp_nom, dept_id) SELECT EmpId + 1000,, emp_nom, 40 FROM employé_tempo WHERE emp_id BETWEEN 7900 AND 7910; Supposons que la table employé soit vide et que la sousrequête sélectionne 3 employés dans la table employé_tempo. Après le insert précédent (3 nuplets): Affichage de Ajoute employé(s) (1 seule fois) 9

Trigger statement level : exemple CREATE TABLE empauditlog ( audit_date DATE, audit_user VARCHAR2(20), audit_desc VARCHAR2(20)); 10

Trigger statement level CREATE OR REPLACE TRIGGER emp_audit_trig AFTER INSERT OR UPDATE OR DELETE ON employé DECLARE v_action VARCHAR2(20); BEGIN IF INSERTING THEN v_action := Employe(s) ajouté(s)'; ELSIF UPDATING THEN v_action := Employe(s) mis à jour'; ELSIF DELETING THEN v_action := Employe(s) effacés'; END IF; INSERT INTO empauditlog VALUES (SYSDATE, USER, v_action); END; 11

Triggers: REFERENCING Les expressions INSERT impliquent un nouveau nuplet (row-level) ou un nouvel ensemble de nuplets (statement-level). DELETE implique un ancien nuplet ou table. UPDATE implique les deux Pour les référencer, on utilise [NEW OLD][TUPLE TABLE] AS <nom> 12

Trigger: la partie Condition Une condition booléenne quelconque (attention, sous Oracle, pas de sousrequêtes) La condition est évaluée avant ou après l'évènement déclencheur, selon que BEFORE ou AFTER apparaisse dans l'événement Accède aux nouveaux/anciens nuplets ou ensembles de nuplets à travers les noms associés à OLD et NEW dans la partie REFERENCING. 13

Trigger: la partie Action Il peut y avoir plus d'une instruction SQL dans la partie action. Encadrés par BEGIN... END Des requêtes n'ont vraiment aucun sens dans une action, il faut donc effectuer des modifications. 14

Un autre exemple On utilise la relation Vend(bar, biere, prix) et une relation unaire CheroBars(bar) qui maintient la liste des bars qui ont augmenté au moins une de leur bière de plus de 1 euro. 15

Exemple Trigger CREATE TRIGGER PrixTrig AFTER UPDATE OF prix ON Vend REFERENCING OLD as o NEW as n FOR EACH ROW WHEN(n.prix > o.prix + 1.00) BEGIN INSERT INTO CheroBars VALUES(:n.bar); END; La mise à jour de Vend.prix On référence ici les nuplets avant et après mise à jour pour chaque n-uplet mis à jour Condition Quand le prix a augmenté significativement, on ajoute à CheroBars 16

Triggers sur des vues Il est impossible de modifier une vue, car elle n'existe pas, les tables sousjacentes sont modifées. Les triggers INSTEAD OF permettent d'effectuer des modifications lorsque la vue est non modifiable. Exemple: on définit une vue TripletGagnant de schéma (client, biere, bar) tel que le bar sert une bière, le client fréquente le bar et apprécie la biere. 17

Exemple CREATE VIEW TripletGagnant AS SELECT Frequente.Client, Apprecie.biere, Vend.bar FROM Apprecie, Vend, Frequente WHERE Apprecie.client = Fréquente.client AND Apprecie.biere = Vend.biere AND Vend.bar = Frequente.bar; Prend une copie de chaque att. Jointure naturelle de Apprecie Vend, and Fréquente 18

Insertion dans une vue Il n'est pas possible d'insérer dans TripletGagnant --- c'est une vue. Pour savoir quels champs d'une vue sont modifiables : SELECT column_name, updatable FROM user_updatable_columns WHERE table_name ='TripletGagnant'; Aucun pour TripletGagnant... 19

Insertion dans une vue On peut utiliser un trigger INSTEAD OF pour remplacer une insertion d'un triplet (Client, Biere, Bar) dans la vue par trois insertions de paires, dans Apprecie, Vend et Fréquente. Vend.prix sera à NULL. 20

Exemple trigger instead of CREATE TRIGGER ViewTrig INSTEAD OF INSERT ON TripletGagnant REFERENCING NEW AS n FOR EACH ROW BEGIN INSERT INTO Apprecie VALUES(:n.client, :n.biere); INSERT INTO Vend (bar, biere) VALUES(:n.bar,:n.biere); INSERT INTO Frequente VALUES(:n.client,:n.bar); END; 21

Contraintes et trucs pour les triggers Ne pas oublier à la fin de la définition d'un trigger : un point (.) et le mot clé run; Ceci permet au trigger d'être installé dans la base de données (et non exécuté) Dans la partie actions, mais pas dans la partie conditions, il faut préfixer new, etc., par : 22

Contraintes et trucs pour les triggers Quand on pose un trigger sur un évènement de la relation R: R ne doit subir aucune modification dans l'action Aucune relation reliée à R par une chaîne de contraintes étrangères ne doit être modifiée Récupérer le message d'erreur du trigger si message d'erreur: Déclencheur créé avec erreurs de compilation. show errors trigger <nom_trigger>; Visualiser les triggers définis select trigger_name from user_triggers; 23

Derniers trucs sur les triggers Pour plus de détails sur un trigger en particulier: select trigger_type, triggering_event, table_name, referencing_names, trigger_body from user_triggers where trigger_name = '<nom_trigger>'; Effacer des Triggers: drop trigger <nom_trigger_name>; Pour rendre un trigger inactif : alter trigger <nom_trigger> {disable enable}; 24

PL/SQL PL/SQL veut dire Procedural Language/SQL. PL/SQL étend SQL en ajoutant des constructions disponibles dans des langages procéduraux L'unité de base en PL/SQL est un bloc. Tous les programmes PL/SQL sont faits de blocs. Un bloc effectue une action logique dans un programme. 25

Bloc en PL/SQL DECLARE <déclarations> BEGIN <instructions> END;. run La section DECLARE est optionnelle. 26

Syntaxe d'une procédure PL/SQL CREATE OR REPLACE PROCEDURE <nom> (<arguments>) AS <déclarations optionnelles> BEGIN <PL/SQL statements> END;. run Obligatoire pour stocker la procédure dans la base de données AS est obligatoire ici 27

Déclarations et affectations en PL/SQL Le mot-clé DECLARE n'apparaît pas en tête des déclarations locales, qui sont juste formées des noms de variables et de leur types Affectation Example: x := y; 28

Déclarations et affectations en PL/SQL Une variable peut avoir pour type classique en SQL (VARCHAR, INTEGER, ) Un type générique en SQL: NUMBER Du même type qu'un attribut d'une table de la base de données Du même type qu'un nuplet dans une table DECLARE prix NUMBER; mabiere VARCHAR(20); mabiere Biere.nom%TYPE; bierenuplet Biere%ROWTYPE;

Exemple:Le menu de Joe Soit la procédure JoeMenu(b,p) qui ajoute la bière b au prix p à toutes les bières vendues par Joe dans la relation Vend. CREATE OR REPLACE PROCEDURE JoeMenu ( b IN Vend.biere%TYPE, p IN Vend.prix%TYPE) AS. BEGIN INSERT INTO Vend VALUES ( Joe s Bar, b, p); END; 30

SELECT INSERT END Instructions de branchement en PL/SQL IF <condition> THEN <liste-instructions> ELSE <liste-instructions> END IF; La partie ELSE est optionnelle. DECLARE a NUMBER; b NUMBER; BEGIN ELSE e,f INTO a,b FROM T1 WHERE e>1; IF b=1 THEN INTO T1 VALUES(b,a); END; INSERT INTO T1 VALUES(b+10,a+10); IF; 31

i INSERT i EXIT END LOOP END LOOP. Boucles PL/SQL EXIT WHEN <condition> Condition: le curseur cursor c n'a trouvé aucun nuplet : c%notfound DECLARE NUMBER := 1; BEGIN LOOP INTO T1 VALUES (i,i); := i+1; WHEN i>100; LOOP; END; 32

Curseurs en PL/SQL Déclaration de la forme : CURSOR <name> IS <query>; Pour déplacer un curseur c, FETCH c INTO <variable(s)>; 33

Exemple de curseur JoeAugmente() envoie un curseur sur les nuplets de Joe dans Vend et augmente de 1 le prix de chaque bière que Joe vend, si ce prix est initialement de moins de 3. 34

JoeAugmente(): Déclarations CREATE OR REPLACE PROCEDURE JoeAugmente() AS LaBiere Vend.biere%TYPE; LePrix Vend.prix%TYPE; CURSOR c IS SELECT biere, prix FROM Vend WHERE bar = Joe s Bar ; 35

Exemple:le corps de la procédure JoeAugmente() BEGIN OPEN c; LOOP FETCH c INTO LaBiere,LePrix; EXIT WHEN c%notfound; IF LePrix < 3.00 THEN UPDATE Vend SET prix = LePrix + 1.00; WHERE bar = Joe s Bar AND biere = LaBiere; END IF; END LOOP; CLOSE c; END; Sortie de boucle Attention, mise à jour et non assignation. 36

Variables Nuplets PL/SQL permet qu'une variable x ait le type d'un nuplet. x R%ROWTYPE donne à x le type des nuplets de R R peut être une relation ou un curseur. x.a donne la valeur de l'attribut a dans le nuplet x. 37

JoeAugmente, version Nuplet CREATE OR REPLACE PROCEDURE JoeAugmente() AS CURSOR c IS SELECT biere, prix FROM Vend WHERE bar = Joe s Bar ; bp c%rowtype; 38

JoeAugmente () version nuplet BEGIN OPEN c; LOOP FETCH c INTO bp; EXIT WHEN c%notfound; IF bp.prix < 3.00 THEN UPDATE Vend SET prix = bp.prix + 1.00 WHERE bar = Joe s Bar AND biere =bp.biere; END IF; END LOOP; CLOSE c; END; 39