Le trigger est un moyen de prendre en compte dans le SGBDR, des contraintes sémantiques complexes que la clause CHECK ne permet pas de déclarer.

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

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

Bases de données avancées

Le langage procédural PL-PGSQL

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

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

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

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

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

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

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

TP Contraintes - Triggers

BASES DE DONNEES TP POSTGRESQL

Bases de Données Avancées PL/SQL

Devoir Data WareHouse

Bases de données relationnelles

Introduction au PL/SQL Oracle. Alexandre Meslé

Corrigés détaillés des exercices

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

Les bases de données

A QUOI SERVENT LES BASES DE DONNÉES?

Intégrité des données

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

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

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

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

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

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

Oracle Le langage procédural PL/SQL

CREATION WEB DYNAMIQUE

Langage SQL : créer et interroger une base

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

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

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

I4 : Bases de Données

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

Gestion de base de données

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

Création et Gestion des tables

Olivier Mondet

A QUOI SERVENT LES BASES DE DONNÉES?

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

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

PROJET 1 : BASE DE DONNÉES REPARTIES

1. Base de données SQLite

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

TP3 : Creation de tables 1 seance

Historisation des données

OpenPaaS Le réseau social d'entreprise

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

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

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

I. MySQL : Serveur et SGBD

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

Auto-évaluation Oracle: cours de base

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

Le Langage De Description De Données(LDD)

SQL Historique

Java Licence Professionnelle CISII,

Rappel. Analyse de Données Structurées - Cours 12. Un langage avec des déclaration locales. Exemple d'un programme

CATALOGUE FORMATIONS DOMAINE Bases de données

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

Comprendre les bases de données

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

1 Position du problème

Compétences Business Objects

Pratique et administration des systèmes

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)

Introduction au langage C

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)

Django et PostgreSQL sous la charge

Mysql avec EasyPhp. 1 er mars 2006

Java DataBaseConnectivity

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

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

Bases de données et sites WEB

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

Les BASES de DONNEES dans WampServer

Administration des bases de données

Cours Informatique Master STEP

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

Cours SQL. Base du langage SQL et des bases 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

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

Ora2Pg Performances. (C) 2013 Gilles Darold

Application BdD et JDBC. Introduction 1/28. I Dans tout les cas, une seule problématique. I Quelques alternatives :

Modélisation PHP Orientée Objet pour les Projets Modèle MVC (Modèle Vue Contrôleur) Mini Framework

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

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

BTS/CGO P10 SYSTEME INFORMATION Année

Algorithmique & programmation

Programmation d application Bases de données avec Java

INTEGRITE ET BD ACTIVES

Présentation Windows Azure Hadoop Big Data - BI

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

Réplication logique avec PostgreSQL 9.4

Transcription:

Chapitre Interfaces de Programmation 1. TRIGGER 1.1. Définition du trigger = reflexe = déclencheur C est une procédure cataloguée dans la base de données, dont l exécution est déclenchée par l occurrence de l événement associé au trigger. Cet événement survient à la suite de conditions particulières : - opération de mise à jour d une table, d un tuple - passage à vrai d une condition sur une ou plusieurs valeurs de données - combinaison d une occurrence d opération de mise à jour et d une condition sur valeur de données Le trigger est un moyen de prendre en compte dans le SGBDR, des contraintes sémantiques complexes que la clause CHECK ne permet pas de déclarer. 1.2. Création de triggers dans la norme SQL (normalisation prévue dans SQL3) CREATE TRIGGER trigger_name AFTER BEFORE INSERT UPDATE DELETE [ OR INSERT UPDATE DELETE ] ON relation_name WHEN condition Action-procedure [FOR EACH ROW STATEMENT ] Exemple de création d un trigger, sous Oracle, qui ajoute un tuple dans la table commande_en_attente, quand la quantité en stock d un article devient inférieure à la quantité minimale spécifiée pour cet article : CREATE TRIGGER tg_reapprovision AFTER UPDATE ON article FOR EACH ROW WHEN article.qte_stock < article.qte_min DECLARE x number SELECT count(*) INTO x FROM commande_en_attente C WHERE C.num_art = article.num_art ; IF (x = 0) THEN INSERT INTO commande_en_attente VALUES(article.num_art, article.qte_reapprov, SysDate); ENDIF; 1.3. Création de triggers dans Postgresql CREATE TRIGGER trigger_name AFTER BEFORE INSERT UPDATE DELETE [ OR INSERT UPDATE DELETE ] ON relation_name [FOR EACH ROW STATEMENT ] EXECUTE PROCEDURE function(); où trigger_name = nom du trigger ; relation_name = nom de la relation à laquelle s applique l événement function = fonction de trigger sous la forme d une procédure stockée, exécutée quand survient l évènement 1/6

Note1 : PostgreSql ne permet pas l exécution d un trigger sur occurrence d une condition mais uniquement AVANT ou APRES une commande (ou instruction = statement) de type Insert, Update ou Delete. Note2 : La fonction de trigger doit être créée avant le trigger. Elle doit être définie comme une fonction sans arguments retournant le type TRIGGER. Note3 : La fonction peut être exécutée pour chacun des tuples concernés par la commande (For each row) ou une seule fois pour la commande (For each statement). Pour l instant PostgreSql n implémente le trigger qu au niveau tuple (For each row). Note4 : Pour l instant, PostgreSql ne permet pas d ouvrir et de fermer une transaction dans une procédure stockée. Les ordres TRANSACTION et END TRANSACTION doivent être spécifiés avant et après l appel de la procédure stockée. Un exemple de trigger sous PostgreSql : Dans le schéma relationnel d une école de conduite, lors d un changement de véhicule pour un élève, on souhaite conserver dans une table archive trace de ce véhicule et du véhicule qui le remplace. Eleve(numel, nomel, preel, adrel, cpel, fixel, mobel, immat#) Arch_eleve (numel, immat, datchange, immat_de_rempl) La fonction à créer pour le trigger est la suivante : CREATE FUNCTION archive_eleve () RETURNS TRIGGER AS ' IF NEW.immat!= OLD.immat THEN INSERT INTO arch_eleve Values (OLD.numel, OLD.immat, today,new.immat); END IF; RETURN NEW; ' LANGUAGE 'plpgsql'; Le trigger à créer est le suivant : CREATE TRIGGER trg_ach_elev BEFORE UPDATE ON eleve FOR EACH ROW EXECUTE PROCEDURE archive_eleve () ; 1.4. Exécution des triggers Le code de la procédure stockée du trigger est automatiquement exécuté par le SGBDR au moment et selon la condition spécifiés dans l'ordre de création du trigger : - avant la finalisation de l'opération si "BEFORE UPDATE DELETE INSERT" - après la finalisation de l'opération si "AFTER UPDATE DELETE INSERT" - avant la finalisation de l'opération si "BEFORE UPDATE DELETE INSERT" et sur occurrence de la condition spécifiée - après la finalisation de l'opération si "AFTER UPDATE DELETE INSERT" et sur occurrence de la condition spécifiée Exemple du trigger Oracle ci-dessus sachant que la quantité minimum requise pour l'article concerné est de 50, la commande suivante Update article set qte_stock = qte_stock + 100 where num_art = 12030; ne déclenchera pas l'exécution de la séquence de code du trigger alors que, avec un stock avant update de 100, la commande suivante Update article set qte_stock = qte_stock - 70 where num_art = 12030; déclenchera l'exécution de la séquence de code du trigger Exemple du trigger Postgresql ci-dessus les commandes suivantes 2/6

Insert into Eleve values(12030,'tartan','pierre','5 rue des As','97110','0590000000','069000000','123WWW971'); Delete from Eleve where numel = 11111; ne déclencheront pas l'exécution de la fonction de trigger alors que, les commandes suivantes Update Eleve set cpel = '97139' where numel = 12030; Update Eleve set immat = '97ZZZ971' where numel = 12030; déclencheront l'exécution de la fonction de trigger 2. Langage procédural PL/SQL Le langage PL/SQL est un langage procédural comportant des instructions structurées (condition, boucles) en plus des instructions SQL. Disponible dans tous les SGBDR, il prend le nom de PL/pgSQL sous PostgreSql (PL/SQL sous Oracle). Un programme en PL/pgSQL est organisé en blocs de code créés dans la base par un ordre CREATE FUNCTION. Chaque bloc peut contenir une infinité de sous-blocs. Chaque sous-bloc doit respecter la structure de bloc, i.e. commencer par DECLARE (optionnel), suivi de, et se terminer après les instructions par un END. CREATE FUNCTION identifier (arguments) RETURNS type AS ' DECLARE declaration; [...] statement; [...] ' LANGUAGE 'plpgsql'; Commentaires PL/PGSQL Ligne simple de commentaires : -- ceci est un commentaire Bloc de commentaires : /* ceci est un bloc de commentaires */ Arguments des fonctions PL/pgSQL La liste d arguments spécifie uniquement le type de chaque argument. Chaque argument est affecté d un identifiant de la forme $i où i est le numéro de l argument ($1 pour le 1 er, $2 pour le second, etc) Une variable peut être associé à un argument en utilisant ALIAS FOR dans la partie déclarative de la fonction : Identifiant_de_variable ALIAS FOR $i Variables PL/PGSQL Les variables doivent toutes être déclarées dans le sous-bloc DECLARE. nom_de variable [CONSTANT] type_de_donnée [NOT NULL] [ [DEFAULT] := value ] ; 3/6

Exemples : Paiement char := O ; Nb_comm integer ; C_number CONSTANT integer := 100 ; Les variables non initialisées reçoivent la valeur NULL par défaut Les types simples sont les types standards SQL : boolean, text, char, varchar, time Ces types sont complétés par le type Record. integer, float, date, Variables PL/PGSQL prédéfinies FOUND : variable booléenne affectée par un Select into, peut être immédiatement testée après cette commande pour savoir si le select a retourné un résultat Variables PL/PGSQL prédéfinies spécifiques aux fonctions de TRIGGERS Nom Type Description NEW Record Nouveau tuple créé après un ordre Insert ou Update OLD Record Ancien tuple laissé par un ordre Delete ou Update TG_NAME Name Nom du trigger déclenché TG_WHEN Text BEFORE ou AFTER selon la spécification du trigger TG_LEVEL Text ROW ou STATEMENT selon la spécification du trigger TG_OP Text INSERT ou UPDATE ou DELETE selon l opération qui a déclenché le trigger TG_RELID Oid Identification (ID) de l objet (relation) auquel est associé le trigger TG_RELNAME Name Nom de la relation à laquelle est associé le trigger Variables attribut Une variable est déclarée avec attribut quand elle destinée à contenir les valeurs d un objet de la base ; il n est pas nécessaire de connaître le type de cet objet, le type de la variable y sera automatiquement adapté. Les attributs sont au nombre de 2 : - attribut %TYPE. La déclaration est la suivante : nom_de_variable nom_de_table. nom_de_colonne%type permet de définir une variable correspondant à un attribut d une relation - attribut %ROWTYPE. La déclaration est la suivante : nom_de_variable nom_de_table%rowtype permet de définir une variable correspondant à un tuple d une relation Exemples : Un_client Client%ROWTYPE ; Nom_client Client.nomcl% TYPE; Instructions PL/PGSQL Affectation Variable := expression Où expression = constante variable expression arithmétique(variable, constante) expression logique(variable, constante) Select into Variable Attribut from relation [ where..] ; la variable reçoit la valeur de l attribut projeté Select into V1, V2,,Vn A1,A2,,An from relation [ where..] ; les variables V1,V2,,Vn reçoivent les valeurs des attributs projetés A1,A2,,An 4/6

NOTE : En PL/pgSQL, pour avoir l équivalent de la commande SQL Select into qui crée une nouvelle table, utiliser Create table as select Return Return {variable expression(variable, constante) } Instruction qui retourne une valeur du type spécifié dans la déclaration de la fonction Une instruction Return doit toujours être incluse avant le END de la fonction (même si elle n est jamais exécutée) IF THEN IF condition THEN instruction; [...] END IF; IF THEN ELSE IF condition THEN instruction; [...] ELSE instruction; [...] END IF; Imbrications de IF THEN ELSE Boucle inconditionnelle LOOP instruction [...] EXIT [étiquette] [WHEN condition ] END LOOP; Cette instruction boucle jusqu à rencontrer l instruction EXIT. Cette dernière peut être conditionnée par WHEN qui précise quand la sortie de boucle doit s effectuer. Boucle WHILE WHILE condition LOOP instruction [...] END LOOP; Similaire à la boucle while dans les langages de programmation standard (Pascal, C,.) Boucle FOR FOR identifiant IN expression1.. expression2 LOOP instruction [...] END LOOP; identifiant est une variable de type entier créée automatiquement en début de boucle puis ou détruite à la fin. Il n est pas nécessaire de la déclarer explicitement (sous DECLARE). expression1 et expression2 sont des expressions entières. FOR variable IN instruction_select LOOP instruction [...] END LOOP; variable est une variable déclarée de type RECORD ou avec l attribut ROWTYPE Un exemple de fonction : Dans la base de données d une école de conduite, on crée une fonction qui pour un numéro d élève donné retourne une chaîne de caractère concaténant le nom et le prénom de l élève modélisé par la relation : Eleve(numel, nomel, preel, adrel, cpel, fixel, mobel, immat#) La fonction est la suivante : CREATE FUNCTION ident_eleve (int4) RETURNS varchar(100) AS ' DECLARE Num_elev ALIAS FOR $1; Nom_elev eleve.nomel%type; Pren_elev eleve.preel%type; Ident varchar(100); SELECT INTO Nom_elev, Pren_elev Nomel, preel FROM eleve WHERE numel = Num_elev; IF FOUND THEN Ident := Nom_elev Pren_elev; 5/6

ELSE Ident := Numero Eleve INEXISTANT END IF; RETURN Ident; ' LANGUAGE 'plpgsql'; Utilisation de PL/PGSQL dans une base de données Définir le langage PL/pgSQL comme objet de la base de données Pour pouvoir être utilisé dans une base de données, le langage PL/PGSQL doit préalablement être défini par l administrateur de la base comme un objet de la base de données. Deux méthodes pour cela : 1) sous psql, avec des ordres SQL : - d'abord créer dans la base le gestionnaire des appels procéduraux (procedural call Handler) Create Function plpgsql_call_handler () Returns OPAQUE As /var/lib/pgsql/plpgsql.so Language C ; où /var/lib/pgsql est le chemin du répertoire contenant la bibliothèque de PostgreSql ; dans certaines configuration il s agit du répertoire /usr/ /lib/pgsql - ensuite créer l objet language Create Language plpgsql Handler plpgsql_call_handler Lancompiler PL/Pgsql ; 2) sur la ligne de commande système, avec l utilitaire : createlang plpgsql nom_base_de_données Créer une fonction stockée : Par la commande Create Function (Cf. ci-dessus) Appel d une fonction stockée : Select nom_de_fonction (arguments) ; ou nom_de_variable := nom_de_fonction (arguments) ou PERFORM nom_de_fonction (arguments) 6/6