Bases de données avancées Triggers

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

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

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

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

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

Le langage procédural PL-PGSQL

Bases de données avancées

Création et Gestion des tables

CREATION WEB DYNAMIQUE

Olivier Mondet

TP Contraintes - Triggers

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

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

Intégrité des données

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

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

Gestion de base de données

BASES DE DONNEES TP POSTGRESQL

Bases de données relationnelles

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

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

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

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

A QUOI SERVENT LES BASES DE DONNÉES?

FileMaker 13. Guide de référence SQL

Corrigés détaillés des exercices

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

Langage SQL : créer et interroger une base

1. Base de données SQLite

Historisation des données

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)

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

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

Introduction au PL/SQL Oracle. Alexandre Meslé

TP3 : Creation de tables 1 seance

SQL Historique

Auto-évaluation Oracle: cours de base

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

Bases de Données Avancées PL/SQL

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

OpenPaaS Le réseau social d'entreprise

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

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

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

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

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

I. MySQL : Serveur et SGBD

Le Langage De Description De Données(LDD)

Modélisation et Gestion des bases de données avec mysql workbench

I4 : Bases de Données

A QUOI SERVENT LES BASES DE DONNÉES?

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

Devoir Data WareHouse

Les BASES de DONNEES dans WampServer

Application web de gestion de comptes en banques

Système de Gestion de Bases de Données Relationnelles. MySQL. Youssef CHAHIR

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

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

Exercices sur SQL server 2000

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

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

Utilitaires méconnus de StrataFrame

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

Compétences Business Objects

La programmation orientée objet Gestion de Connexions HTTP Manipulation de fichiers Transmission des données PHP/MySQL. Le langage PHP (2)

Le Langage SQL version Oracle

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

1 Position du problème

Bases de Données Réparties

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

Pratique et administration des systèmes

LE LANGAGE SQL2 1. INTRODUCTION

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

PHP et les Bases de données - Généralités

Présentation Windows Azure Hadoop Big Data - BI

Encryptions, compression et partitionnement des données

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

INTEGRITE ET BD ACTIVES

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

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

Les bases de données

Ora2Pg Performances. (C) 2013 Gilles Darold

Réplication logique avec PostgreSQL 9.4

Gestion des utilisateurs et de leurs droits

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

Arbres binaires de recherche

Comprendre les bases de données

PHP. Bertrand Estellon. 26 avril Aix-Marseille Université. Bertrand Estellon (AMU) PHP 26 avril / 214

SQL Server Cyril Gruau. 11 février 2003

SQL sous SqlServer OLIVIER D. DEHECQ Olivier 0

SQL Server 2000, Analysis Services et DTS

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

Comment Connecter une Base de Données MySQL via un Driver JDBC Avec OpenOffice.org

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

Quelques aspects du Relationnel-Objet du SGBD Oracle

Chapitre 3 LE MODELE RELATIONNEL ET SQL (DDL)

Oracle Le langage procédural PL/SQL

Génie Logiciel avec Ada. 4 février 2013

Transcription:

Bases de données avancées Triggers Wies law Zielonka 6 avril 2015 Résumé Ces notes ne sont pas corrigées, mais peut-être vous les trouverez quand même utiles pour préparer l examen ou projet. Ne pas distribuer. 1 Création d un trigger Pour associer un trigger à une table table : CREATE TRIGGER nom_de_trigger { BEFORE AFTER } { event [ OR... ] } ON table [ FOR [ EACH ] { ROW STATEMENT } ] EXECUTE PROCEDURE fonc ( arguments ) ; Cette commande crée un trigger dont le nom est nom_de_trigger associé à la table table. event spécifie l évènement qui déclenche l exécution d un trigger, les valeurs possibles pour event sont : UPDATE, DELETE, INSERT. On peut spécifier plusieurs évènements séparés par OR. L activation du trigger provoque l exécution de la fonction fonc. La fonction qui implémente uin trigger est une fonction sans paramètres. Il y a deux types de triggers, les triggers ROW et les triggers STATEMENT. Le trigger FOR EACH ROW est exécuté pour chaque ligne sur laquelle agit l opération (pour chaque évènement). Par exemple si INSERT insère 15 éléments dans une table alors le trigger associé à l insertion sera appelé 15 fois, une fois pour chaque ligne insérée. Le trigger FOR EACH STATEMENT est appelé une seule fois, indépendamment du nombre de lignes affectées par l opération. En particulier si le trigger STATEMENT est associé à l évènement DELETE et un utilisateur exécute la commande DELETE alors le trigger STATEMENT sera appelé une fois même si le nombre de lignes supprimées est 0. BEFORE ou AFTER indiquent le moment quand le trigger est exécuté : Le trigger BEFORE FOR EACH ROW est exécuté pour chaque ligne qui sera modifiée/inserée/supprimée avant la modification. Le trigger AFTER FOR EACH ROW est exécuté pour chaque ligne qui a été modifiée/inserée/supprimée juste après la modification. Les triggers pour le même évènement sont appelés dans l ordre alphabétique. Pour créer les triggers il faut le privilège trigger sur la table. DROP TRIGGER nom_de_trigger supprime un trigger. 2 Variables prédéfinies dans les triggers Quelques variables sont prédéfinies et peuvent être utilisées dans une fonction implémentant un trigger. 1

Nom Type Description NEW RECORD Nouvelle valeur de la ligne (pour UPDATE) ou nouvelle ligne (pour INSERT). La variable est NULL pour DELETE. OLD RECORD Ancienne valeur de la ligne (pour UPDATE) ou l ancienne ligne (pour DELETE). TG_NAME name Le nom du trigger. TG_WHEN text Valeurs possibles : BEFORE ou AFTER TG_LEVEL text valeurs possibles : ROW ou STATEMENT TG_OP text Le nom d opération qui a déclenchée le trigger : INSERT, UPDATE, ou DELETE TG_RELNAME name Le nom de la table associée au trigger 3 Commentaires Chaque triggers doit être associé à une table. Les fonctions triggers n ont pas de paramètres. Les fonctions trigger de type STATEMENT doivent retourner NULL. Les triggers de type FOR EACH ROW retournent soit NULL, soit une ligne complète de la table. La valeur retournée par la fonction de trigger FOR EACH ROW est utilisée de façon suivante : (1) si le trigger est de type AFTER EACH ROW alors la valeur retournée par la fonction de trigger est ignorée. (2) Les triggers de type BEFORE EACH ROW retournent NULL pour signaler que la suite de l opération ne sera pas exécutée pour la ligne donnée. Par exemple, pour un trigger BEFORE INSERT FOR EACH ROW si la fonction de trigger retourne NULL alors l insertion de la ligne sera annulée. Pour un trigger BEFORE UPDATE FOR EACH ROW si la fonction de trigger retourne NULL alors la modification de la ligne sera annulée. Pour un trigger BEFORE DELETE FOR EACH ROW si la fonction de trigger retourne NULL alors la suppression de la ligne sera annulée. (3) Si la valeur non null est retournée par une fonction de trigger BEFORE event FOR EACH ROW alors c est cette valeur qui sera utilisée par le serveur SQL pour faire INSERT et UPDATE (mais aucun effet pour DELETE). Donc supposons que l opération UPDATE est exécutée, cela déclenche un trigger BEFORE et la fonction de trigger retourne un record x. Alors la nouvelle valeur de la ligne sera x, et peut être différente de la valeur assignée par UPDATE. Pour modifier la valeur retournée par un trigger la fonction peut directement modifier les attributs dans NEW et retourner NEW ainsi modifié ou elle peut construire un nouveau record et le retourné. En particulier si nous voulons que la nouvelle valeur de la ligne soit celle indiquée par UPDATE alors la fonction de trigger doit retourner NEW. Les triggers du type BEFORE ROW sont utilisés pour vérifier et/ou modifier les lignes sur lesquelles agit le trigger Les triggers du type AFTER ROW sont utilisés pour propager les changements dans d autres tables. Triggers en cascade. Les fonctions associées aux trigger peuvent contenir le code SQL qui provoque le déclenchement d autres triggers. 2

4 Archivage de modifications de la table Clients Dans cet exemple on écrit un trigger qui fait archivage de toutes les modifications dans la table Clients (UPDATE ou DELETE). On utilisera une table auxiliaire archive_client pour archiver les modifications de la table Clients. On utilisera les tables suivantes : --------------------------- creer_tables.sql ---------------------- DROP TABLE clients; DROP TABLE archive_clients; CREATE TABLE clients ( client_id nom_client teleph naissance_date solde integer primary key, character varying(50) not null, character(10), date, decimal(7,2) CREATE TABLE archive_clients ( client_id integer, nom_client character varying(50) not null, teleph character(10), naissance_date date, solde decimal(7,2), qui_change varchar, quand_change date, operation varchar Création du trigger. --------------------- creer_trig.sql ------------------------------ -- creation d un trigger ------------------------------------- DROP TRIGGER IF EXISTS archiver_clients ON clients; CREATE TRIGGER archiver_clients --nom du trigger AFTER DELETE OR UPDATE --pour DELETE et UPDATE ON clients --executer si l evenement dans la table clients FOR EACH ROW --pour chaque ligne EXECUTE PROCEDURE archive_clients( ------------------------------------------------------------------- --------------------------------------- function.sql -------------------- -- La fonction associee au trigger. CREATE OR REPLACE FUNCTION archive_clients() RETURNS TRIGGER AS $$ DECLARE mindec CONSTANT DECIMAL(7,2) DEFAULT -10000; BEGIN -- on ne peut supprimer un client quand son solde est non zero IF TG_OP = DELETE THEN IF OLD.solde <> 0 THEN return NULL; ELSE return OLD; --la suite concerne UPDATE, --le nouveau solde ne peut pas etre NULL IF NEW.solde IS NULL THEN RAISE EXCEPTION solde de % ne peut pas etre null, OLD.nom_client; 3

-- si le nouveau solde inferieur a mindec afficher un message IF NEW.solde < mindec THEN RAISE NOTICE solde de % inferieur a %, OLD.nom_client, mindec; --inserer dans l archive OLD avec le timestamp courant --et identifiant de celui qui a provoque l appel au trigger. INSERT INTO archive_clients VALUES ( OLD.client_id, --on met dans l archive les anciennes valeurs OLD.nom_client, OLD.teleph, OLD.naissance_date, OLD.solde, CURRENT_USER, --qui execute INSERT/UPDATE now(), --quand TG_OP --type d operation RETURN NULL; $$ LANGUAGE plpgsql ; 5 Exemple Dans cet exemple on utilisera les tables suivantes : Création des tables ------------------------ exemple.sql ---------------------------------- DROP TABLE Commandes; DROP TABLE Prix; DROP TABLE Pieces; DROP TABLE Fournisseurs;; CREATE TABLE Pieces( piece_id INT PRIMARY KEY, description VARCHAR(70) NOT NULL, en_stock INT NOT NULL, stock_max INT NOT NULL, stock_min INT NOT NULL, CHECK(stock_min < stock_max) CREATE TABLE Fournisseurs( fournisseur_id INT PRIMARY KEY, nom VARCHAR(40) NOT NULL, adresse VARCHAR(30) CREATE TABLE Prix( fournisseur_id INT REFERENCES Fournisseurs(fournisseur_id), piece_id INT REFERENCES Pieces(piece_id), prix DECIMAL(10,2) NOT NULL CHECK(prix > 0), PRIMARY KEY(fournisseur_id,piece_id) CREATE TABLE Commandes( fournisseur_id INT REFERENCES Fournisseurs, piece_id INT NOT NULL REFERENCES Pieces, quantite INT NOT NULL CHECK(quantite > 0), 4

date_commande DATE NOT NULL, date_reception DATE DEFAULT NULL, PRIMARY KEY(fournisseur_id,piece_id,date_commande), CHECK( date_reception IS NULL OR date_reception >= date_commande) Le trigger suivant sera associé à la table Pieces. Si le nombre de pièces en stock est insuffisant alors le trigger doit passer une commande pour compléter le stock. Créer la fonction de trigger. -------------------------------- function.sql ------------------------- -- le trigger associe avec Pieces. CREATE OR REPLACE FUNCTION pieces() RETURNS TRIGGER AS $$ DECLARE toto INT; i INT; p Prix.prix%TYPE; f Fournisseurs.fournisseur_id%TYPE; BEGIN -- IF NEW.en_stock > OLD.en_stock THEN IF NEW.en_stock < 0 THEN NEW.en_stock = 0; i := 0; -- Combien de pieces de ce type est deja commande? FOR toto IN SELECT quantite FROM Commandes WHERE piece_id = OLD.piece_id LOOP i := i+toto; END LOOP; -- Si en_stoc + commande depassent le stock minimum -- alors pas de commandes a passer IF i + NEW.en_stock > OLD.stock_min THEN -- stock insuffisant passer la commande -- quel est le prix min pour cette piece? SELECT min(prix) INTO p FROM Prix WHERE OLD.piece_id = Prix.piece_id; -- pas de fournissuer rien a faire IF NOT FOUND THEN RETURN NULL; -- select un des fournisseur avec le prix minimal SELECT fournisseur_id INTO f FROM Prix WHERE prix = p LIMIT 1; --commander chez lui INSERT INTO Commandes VALUES (f,old.piece_id,old.stock_max - i + NEW.en_stock, current_date 5

$$ LANGUAGE plpgsql ; Déclarer le trigger. CREATE TRIGGER verif_pieces BEFORE UPDATE OR INSERT ON Pieces FOR EACH ROW EXECUTE PROCEDURE pieces( On ajoute un trigger associé aux Commandes. Si la commande est réalisée alors ajouter les pièces correspondant dans le stock (table Pieces). --------------------------------- deliver.sql --------------------- CREATE OR REPLACE FUNCTION deliver() RETURNS TRIGGER AS $$ DECLARE toto INT; i INT; p Prix.prix%TYPE; f Fournisseurs.fournisseur_id%TYPE; BEGIN -- verifier si effectivement il s agit -- de la livraison d une commande IF TG_OP = UPDATE AND (NEW.date_reception IS NULL OR OLD.date_reception IS NOT NULL) THEN IF TG_OP = INSERT AND NEW.date_reception IS NULL THEN -- commande est delivree -- mettre a jour le stock UPDATE pieces SET en_stock = en_stock + NEW.quantite WHERE piece_id = NEW.piece_id; IF NOT FOUND THEN RAISE EXCEPTION il y a un probleme ; RETURN NULL; $$ LANGUAGE plpgsql ; 6