Les Triggers SQL. Didier DONSEZ. Université de Valenciennes Institut des Sciences et Techniques de Valenciennes donsez@univ-valenciennes.



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

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

TP Contraintes - Triggers

Bases de données avancées

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

Intégrité des données

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

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

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

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

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

Introduction au PL/SQL Oracle. Alexandre Meslé

Devoir Data WareHouse

Gestion de base de données

Administration des bases de données

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

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

Corrigés détaillés des exercices

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

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

Bases de données relationnelles

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

Langage SQL : créer et interroger une base

A QUOI SERVENT LES BASES DE DONNÉES?

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

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

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

Bases de Données Réparties

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

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

Bases de Données Avancées PL/SQL

Olivier Mondet

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

Bases de données et sites WEB

INTEGRITE ET BD ACTIVES

CREATION WEB DYNAMIQUE

Auto-évaluation Oracle: cours de base

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

Panorama des Bases de Données

Le Langage De Description De Données(LDD)

Les Bases de Données et l Objet Introduction

Historisation des données

A QUOI SERVENT LES BASES DE DONNÉES?

BASES DE DONNEES TP POSTGRESQL

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) ;

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

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 et sites WEB Licence d informatique LI345

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

1 Position du problème

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

Quelques aspects du Relationnel-Objet du SGBD Oracle

TP3 : Creation de tables 1 seance

SQL Historique

Création et Gestion des tables

Panorama des Bases de Données

Les bases de données

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

SQL Server Cyril Gruau. 11 février 2003

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

SQL sous SqlServer OLIVIER D. DEHECQ Olivier 0

SQL Server 2000, Analysis Services et DTS

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

MySQL / SQL EXEMPLES

Gestion des utilisateurs et de leurs droits

Introduction aux Bases de Données 2004/2005

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

OpenPaaS Le réseau social d'entreprise

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

Le Langage SQL version Oracle

Le langage procédural PL-PGSQL

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

Les Objets dans SQL3 et dans Oracle et Informix

APIs de table pour SQL Server

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

SGBDR. Systèmes de Gestion de Bases de Données (Relationnelles)

Application web de gestion de comptes en banques

Les transactions 1/46. I même en cas de panne logicielle ou matérielle. I Concept de transaction. I Gestion de la concurrence : les solutions

Encryptions, compression et partitionnement des données

LE LANGAGE SQL2 1. INTRODUCTION

Modernisation, développement d applications et DB2 sous IBM i Technologies, outils et nouveautés Volubis.fr

1. Introduction. Introduction au langage SQL3 (SQL 99) Plan. Sources du cours. 1. Introduction La norme SQL3 et ses composants

Introduction au Système de Gestion de Base de Données et aux Base de Donné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

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

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

Systèmes de Gestion de Bases de Données

I4 : Bases de Données

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

Compétences Business Objects

Quelques patterns pour la persistance des objets avec DAO DAO. Principe de base. Utilité des DTOs. Le modèle de conception DTO (Data Transfer Object)

Présentation Windows Azure Hadoop Big Data - BI

Comprendre les bases de données

Administration des bases de données relationnelles Part I

Attaques applicatives

Transcription:

Les Triggers SQL Didier DONSEZ Université de Valenciennes Institut des Sciences et Techniques de Valenciennes donsez@univ-valenciennes.fr 1 Sommaire Motivations Trigger Ordre Trigger Ligne Condition Trigger INSTEAD OF Limitations Différences entre SQL3, Oracle et Informix Les déclencheurs SQL, 2

Principe Base de Données Active réagit aux changements d état de la base de données Déclencheur = Evénement-Condition-Action Evénement dans la base Condition Déclenchement d une action Trigger SQL Evénement =,, dans une relation Action = un ou plusieurs ordres SQL, SQL procédural Les déclencheurs SQL, 3 Motivations Pourquoi faire? valider les données entrées créer un audit de la base de données dériver des données additionnelles maintenir des règles d intégrité complexes implanter des règles de métier supporter des alertes (envoi de e-mails par exemple) Gains développement plus rapide les triggers sont stockées dans la base maintien global des règles d intégrité Les déclencheurs SQL, 4

Différents triggers SQL TRIGGER ORDRE LIGNE (FOR EACH ROW) BEFORE AFTER BEFORE AFTER INSTEAD OF Les déclencheurs SQL, 5 SQL3 Remarques Différence entre produits et standards SQL3 (n est pas dans SQL2) Oracle Informix Différent des constraintes et des assertions SQL2 l evénement est programmable Pas de condition dans les CHECK. Les déclencheurs SQL, 6

SQL3 Trigger Ordre CREATE TRIGGER nom_du_trigger type_interposition type_ordre ON nom_de_la_table action l action est exécutée une seule fois avant (type_interposition=before) ou après (=AFTER) l exécution d un ordre sur la relation nom_de_la_table le type de l ordre type_ordre peut être,,, type_ordre OR type_ordre, OF liste_de_colonnes Les déclencheurs SQL, 7 SQL3 Action Différences entre SQL3 1 ou plusieurs SQL/DML et SQL/PSM Informix 9 Oracle 8 1 seul ordre SQL,, 1 seul appel de procédure ou fonction EXEC PROCEDURE, EXEC FUNCTION 1 procédure anonyme PL/SQL DECLARE BEGIN EXCEPTION END; Les déclencheurs SQL, 8

Exemple de Trigger Ordre Vente(gencod, qte, prix) VolumeAffaire(total,date) CREATE TRIGGER tg_modifvolume AFTER ON Vente DECLARE s number; BEGIN select sum(prix*qte) into s from Vente; insert into VolumeAffaire value(s,current); END; CREATE TRIGGER tg_modifinterdit AFTER OF prix, qte ON Vente BEGIN raise_application_error(-9998, Modification interdite ); END; Les déclencheurs SQL, 9 SQL3 Trigger Ligne (FOR EACH ROW) CREATE TRIGGER nom_du_trigger type_interposition type_ordre ON nom_de_la_table FOR EACH ROW action l action est exécutée avant (type_interposition=before) ou après (=AFTER) l opération réalisée sur chaque ligne de la relation nom_de_la_table Les déclencheurs SQL, 10

SQL3 Variables de Transition des Triggers Ligne l action du trigger ligne peut utiliser deux variables de transition (old et new) contenant les valeurs de la ligne avant et après l événement SQL3 Variables implicites dans Oracle :old et :new Déclaration explicite dans Informix et SQL3 REFERENCING OLD AS variable_avant NEW AS variable_apres Remarque la variable avant n a pas de sens dans un la variable après n a pas de sens dans un Les déclencheurs SQL, 11 Exemple de Trigger Ligne Vente(gencod, qte, prix) Stock(gencod, qte) CREATE TRIGGER tg_nouvvente AFTER ON Vente FOR EACH ROW BEGIN if :new.qte > (select qte from Stock where gencod = :new.gencod) then raise_application_error(-9997, Stock insuffisant ); else update Stock set qte := Stock.qte - :new.qte where gencod = :new.gencod; END; Les déclencheurs SQL, 12

Exemple de Trigger Ligne Commande(gencod, qte, prix) CREATE TRIGGER tg_nouvcmd AFTER ON Commande FOR EACH ROW BEGIN if :new.qte < :old.qte then raise_application_error(-9996, Impossible de diminuer la commande ); else... END; Les déclencheurs SQL, 13 SQL3 Condition de déclenchement WHEN CREATE TRIGGER nom_du_trigger type_interposition type_ordre ON nom_de_la_table FOR EACH ROW WHEN (attribut condition_sql valeur) action l attribut est une colonne de la ligne avant (:old.colonne) ou après (:new.colonne) l événement la condition est une condition SQL =,!=, >, <, IN, BETWEEN la valeur ne peut être le résultat d un ordre SELECT Les déclencheurs SQL, 14

Exemple de Condition sur le déclenchement d un trigger Commande(gencod, typeprod, qte, prix) CREATE TRIGGER tg_nouvcmd AFTER ON Commande FOR EACH ROW WHEN (new.qte < old.qte AND new.typeprod IN ( Viande, Poisson )) BEGIN raise_application_error(-9996, Impossible de diminuer la commande pour ce type de produit ); END; Les déclencheurs SQL, 15 Limite de la clause WHEN Commande(gencod, qte, prix) Produit(gencod, descr, typeprod) CREATE TRIGGER tg_nouvcmd AFTER ON Commande FOR EACH ROW WHEN (new.gencod IN (select gencod from Produit where typeprod in ( Viande, Poisson ) ) BEGIN raise_application_error(-9995, Impossible de diminuer la commande pour ce type de produit ); END; -- NE FONCTIONNE PAS Les déclencheurs SQL, 16

Traitements différenciés les prédicats ING, UPDATING, DELETING sont utilisables en PL/SQL pour différencier le type de l ordre qui a déclenché le trigger. CREATE TRIGGER tg_modifcmd AFTER OR ON Commande FOR EACH ROW BEGIN if DELETING then raise_application_error(-9995, Impossible d annuler la commande ); else if UPDATING and :new.qte < :old.qte then raise_application_error(-9996, Impossible de diminuer la commande ); END; Les déclencheurs SQL, 17 Limitations Pas d ordre (statement) dans l action de transaction COMMIT, ROLLBACK, SAVEPOINT de connection ou de session mais l action peut lever une exception raise_application_error Attention aux tables en mutation Les déclencheurs SQL, 18

SQL3 Action sur une table en mutation Produit(gencod, descr, typeprod) CREATE TRIGGER tg_prod BEFORE OR OR ON Produit FOR EACH ROW DECLARE n integer BEGIN select gencod into n from Produit where typeprod= Viande ;... END; Suppresion FROM Produit; ERROR table DEMO.Produit is mutating Insertion INTO Produit VALUES(8736, Lentilles, Epicerie ); OK Les déclencheurs SQL, 19 SQL3 Action sur une table en mutation SELECT autorisé TRIGGER ORDRE LIGNE (FOR EACH ROW) BEFORE AFTER BEFORE AFTER INSTEAD OF pas de SELECT sur la table en mutation Les déclencheurs SQL, 20

SQL3 Trigger INSTEAD OF La modification sur la table (ou sur la vue) est remplacée par l action les variables :old et :new sont utilisées dans l action comme si l événement avait lieu Usage CREATE TRIGGER nom_du_trigger INSTEAD OF type_ordre ON nom_de_la_table FOR EACH ROW action permet les modifications sur une vue par exemple une vue Objet Relationnelle d une base Relationnelle Les déclencheurs SQL, 21 Exemple de Trigger INSTEAD OF (i) Base relationnelle create table Pers( numss number, nom varchar2(10), prenom varchar2(10)); create table Tel(numss number, numtel varchar2(10)); Vue Objet create type listtel_t AS as varray(10) of varchar2(10); create type ovpers_t as object ( numss number, nom varchar2(10), prenom varchar2(10), listtel listtel_t); create view ovpers of ovpers_t with objectoid(numss) as select numss, nom, prenom, cast( multiset( select numtel from Tel t where t.numss=p.numss) as listtel_t) from Pers p; Les déclencheurs SQL, 22

Exemple de Trigger INSTEAD OF (ii) Trigger INSTEAD OF create trigger tg_ins_ovpers instead of insert on ovpers for each row declare i: integer; begin insert into Pers values(:new.numss, :new.nom, :new.prenom); if :new.listtel is not null and :new.listtel.count > O then for i in :new.listtel.first :new.listtel.last loop insert into Tel values (:new.numss, :new.listtel(i)); end loop; end if; end; > insert into ovpers values ( 1390120989, Dupont, Jean, listtel_t( 0327141234, 0320445962 ) ); Les déclencheurs SQL, 23 SQL3 Gestion des Triggers CREATE TRIGGER nom_trigger... le trigger nom_trigger est crée et activé. CREATE OR REPLACE TRIGGER nom_trigger... le trigger nom_trigger est modifié. DROP TRIGGER nom_trigger le trigger nom_trigger est supprimé de la base. ALTER TRIGGER nom_trigger DISABLE le trigger nom_trigger est déactivé. ALTER TRIGGER nom_trigger ENABLE le trigger nom_trigger est réactivé. CREATE TRIGGER incendie_entrepot AFTER ON Vente BEGIN raise_application_error(-9999, «Vente impossible»); END; ALTER TRIGGER incendie_entrepot DISABLE; Les déclencheurs SQL, 24

Trigger dans Informix (i) l'action 1 seul ordre SQL,,, EXEC PROCEDURE, EXEC FUNCTION MAIS il peut y avoir 1 ordre avant et 1 ordre après CREATE TRIGGER tg_modif_stock OF qte ON Stock BEFORE(EXECUTE PROCEDURE procavantmodif()) AFTER(EXECUTE PROCEDURE procavantmodif()); Les déclencheurs SQL, 25 Trigger d Informix (ii) Variables de transition Cmd(numprod, qte, prixtotal) Stock(numprod, prixunit, qte) CREATE TRIGGER tg_modif_cmd OF Cmd ON qte REFERENCING OLD AS pre NEW AS post FOR EACH ROW ( Stock SET qte=stock.qte -(post.qte-pre.qte) WHERE numprod=pre.numprod ); Les déclencheurs SQL, 26

Trigger d Informix (iii) Fonctions d un trigger Cmd(numprod, qte, prixtotal) CREATE TRIGGER tg_modif_cmd OF Cmd ON qte REFERENCING OLD AS pre NEW AS post FOR EACH ROW ( EXECUTE FUNCTION fnouveauprixtotal( pre.qte, post.qte, pre.prixtotal) INTO prixtotal) ) CREATE FUNCTION fnouveauprixtotal( oldqte INT, newqte INT, total MONEY(8)) RETURNING MONEY(8); DEFINE u_price LIKE Cmd. prixtotal; DEFINE n_total LIKE Cmd. prixtotal; LET u_price = total / oldqte ; LET n_total = newqte * u_price; RETURN n_total; END FUNCTION; Les déclencheurs SQL, 27 Interactions Cascade de triggers l action d un trigger peut déclencher d autres triggers Interactions avec les contraintes l action d un trigger peut causer la vérification des contraintes les actions des constraintes référencielles peuvent déclencher des triggers les triggers sont déclenchés par ON CASCADE les triggers sont déclenchés par ON SET NULL DEFAULT, ON CASCADE, ON SET NULL DEFAULT Les déclencheurs SQL, 28

Ordonnancement de triggers multiples Plusieurs triggers peuvent être définis pour le même événement La date de création d un trigger est conservée dans la base Les triggers sont activés dans l ordre ascendant de leur date de création Remarque pour Oracle Un seul trigger sur la même table avec les mêmes événements de déclenchement. Oracle est un produit, SQL3 du papier Les déclencheurs SQL, 29 Modèle SQL3 de traitement des Triggers Les déclencheurs SQL, 30

Conclusion SGBD Actif Contrôle dynamique et évolutif des manipulations dans la base Duplication contrôle d information Etendre les mécanismes de contrôle d intégrité palier aux limites des contraintes Les déclencheurs SQL, 31 Bibliographie Nelson Mattos, "An Overview of the SQL3 Standard", presentation foils, Database Technology Institute, IBM Santa Teresa Lab., San Jose, CA, July 1996, ftp://jerry.ece.umassd.edu /isowg3/dbl/basedocs/descriptions/sql3_foils.ps Scott Urman, «Oracle8 PL/SQL Programming», ed Osborne- McGraw-Hill, Oracle Press Series, ISBN 0-07-882305-6. " Using Oracle8 Object Views: An Example, An Oracle Technical White Paper, October 1997, http://www.oracle.com/st/o8collateral/html/objview2.html Steven Feuerstein, «Oracle PL/SQL Programming»,2nd Edition, ed O'Reilly. ISBN 1-56592-335-9. Les déclencheurs SQL, 32

Exercices Soit la base Vente(gencod, qte, prix) VolumeAffaire(total,date) Donner un trigger ligne qui modifie le Volume d Affaire en cas d insertion, de modification et du suppression dans Vente. Version 1 : VolumeAffaire ne contient qu une ligne qui sera modifiée Version 2 : VolumeAffaire contient une ligne par mise à jour dans Vente Version 3 : VolumeAffaire contient une ligne par journée de Vente Les déclencheurs SQL, 33