Oracle : Triggers (déclencheurs) extrait d'un cours (Lille)

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

Le Langage SQL version Oracle

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

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

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

TP Contraintes - Triggers

Initiation à SQL. Le langage de communication avec une base de données relationnelles. Application avec PostgreSQL. Nathalie Camelin 2011/2012

Bases de Données Avancées PL/SQL

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

Bases de données avancées

Optimisation SQL. Quelques règles de bases

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

Historisation des données

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

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

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

Intégrité des données

Introduction au PL/SQL Oracle. Alexandre Meslé

TP3 : Creation de tables 1 seance

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

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

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

Corrigés détaillés des exercices

Devoir Data WareHouse

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

Le Langage De Description De Données(LDD)

Support de cours «SGBD»

1. Qu'est qu'un tablespace?

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

Administration des bases de données

A QUOI SERVENT LES BASES DE DONNÉES?

Bases de Données Réparties

Olivier Mondet

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

Bases de données. Mihaela Mathieu

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

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

SQL Historique

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

Gestion de base de données

Langage SQL : créer et interroger une base

CATALOGUE FORMATIONS DOMAINE Bases de données

Bases de données relationnelles

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

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

Oracle upg adm 9i Claude DA COSTA Chap 18 Work Space Manager Page 1/20 WORK SPACE MANAGER

Création et Gestion des tables

CREATION WEB DYNAMIQUE

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

Auto-évaluation Oracle: cours de base

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

Bases de données et sites WEB

Les bases de données

Présentation Windows Azure Hadoop Big Data - BI

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

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

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

Gestion des utilisateurs et de leurs droits

420-PK6-SL Banques de données Avancées. UTILISATEURS (suite)

Impact on revenue requirements no Description (000$)

OpenPaaS Le réseau social d'entreprise

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

Sécurité Oracle Gérard Schaller Grifes 28 Octobre 2003

Fascicule des Travaux Pratiques Oracle

Cours 4. Gestion de la performance. DBA - Maîtrise ASR - Université Evry

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

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

Bases de SQL. Hacks 1-6 CHAPITRE UN

NFA 008. Introduction à NoSQL et MongoDB 25/05/2013

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

A QUOI SERVENT LES BASES DE DONNÉES?

Les BASES de DONNEES dans WampServer

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

Application web de gestion de comptes en banques

Groupe 11 TABLE DES MATIERES

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

INTEGRITE ET BD ACTIVES

Réplication logique avec PostgreSQL 9.4

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

M2106 : Programmation et administration des bases de données

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

APIs de table pour SQL Server

Compétences Business Objects

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

FileMaker 13. Guide de référence SQL

Université de Nice Sophia-Antipolis. Langage SQL. version 5.7 du polycopié. Richard Grin

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

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

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

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

Bases de Données Avancées

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

IFT3030 Base de données. Chapitre 1 Introduction

Package Contents. System Requirements. Before You Begin

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

Pratique et administration des systèmes

Transcription:

Oracle : Triggers (déclencheurs)

Déclencheur (Trigger) Il s'agit d'un traitement implicite déclenché par un événement Utilisé pour implémenter des règles de gestion complexes et pour étendre les règles d'intégrité référentielles associées à la table lors de leur création de cette dernière Un trigger peut être associé soit à un outil client, soit à une table Un trigger est défini au moyen du langage PL/SQL.

Caractéristiques d'un Trigger Le traitement est exprimé en PL/SQL. Il peut lui-même faire appel à des procédures et des fonctions écrites en PL/SQL ou Java. Son code est stocké dans la base de données. Il est déclenché sur un événement complété par un prédicat Un déclencheur peut être actif ou non (enable disable) Si un déclencheur réussit, la transaction qui l'a appelé peut se poursuivre Le déclenchement peut se propager en cascade, tout en respectant le principe d'atomicité d'une transaction

Description d'un trigger Le traitement peut s'appliquer : À la commande (l'ordre) : dans ce cas, le trigger ne s'applique qu'une fois À chaque ligne de la table concernée par l'événement générateur : dans ce cas, le trigger s'applique autant de fois que nécessaire

Structure d'un déclencheur Ordre SQL ROW BEFORE AFTER INSERT UPDATE DELETE Table

Illustration 1 CREATE OR REPLACE TRIGGER myfirsttrigger 2 BEFORE UPDATE OF ename ON emp on peut faire UPDATE une col. 3 FOR EACH ROW 4 BEGIN 5 DBMS_OUTPUT.ENABLE(20000);-- active l affichage 6 DBMS_OUTPUT.PUT_LINE(:NEW.ENAME :OLD.ENAME); 7 EXCEPTION 8 WHEN OTHERS THEN 9 DBMS_OUTPUT.PUT_LINE(SQLERRM); 10 END; SQL> UPDATE emp SET ename = 'Durand' WHERE empno = 7839; SQL> Durand Sami

Résolution multi-événements Un Trigger peut répondre à plusieurs événements. Dans ce cas, il est possible d'utiliser les prédicats intégrés INSERTING, UPDATING ou DELETING pour exécuter une séquence particulière du traitement en fonction du type d'événement.

Résolution multi-événements CREATE OR REPLACE TRIGGER myfirsttrigger AFTER UPDATE OR INSERT ON sadeg.emp FOR EACH ROW BEGIN DBMS_OUTPUT.ENABLE(20000); IF INSERTING THEN DBMS_OUTPUT.PUT_LINE(' INSERT '); END IF; IF UPDATING('ENAME') THEN DBMS_OUTPUT.PUT_LINE(' mis a jour ' :NEW.ENAME); END IF; END; / Trigger created. SQL> UPDATE emp SET ename = 'TOTO' WHERE empno = 7839; mis a jour TOTO 1 row updated.

Typologie d'un Trigger BEFORE BEFORE UPDATE ligne BEFORE DELETE ligne BEFORE INSERT ligne BEFORE UPDATE ordre BEFORE DELETE ordre AFTER AFTER UPDATE ligne AFTER DELETE ligne AFTER INSERT ligne AFTER UPDATE ordre AFTER DELETE ordre BEFORE INSERT ordre AFTER INSERT ordre

Exemple : contrôle d'un traitement SQL> CREATE OR REPLACE TRIGGER ajout BEFORE INSERT ON sadeg.dept BEGIN IF (USER!= 'TOTO') THEN RAISE_APPLICATION_ERROR(-20001,'Vous n''etes pas ' USER); END IF; END; / Trigger created. SQL> INSERT INTO sadeg.dept VALUES(99,'Mkt','London'); INSERT INTO sadeg.dept VALUES(99,'Mkt','London') * ERROR at line 1: ORA-20001: Vous n'etes pas SADEG! ORA-06512: at "SCOTT.AJOUT", line 3 ORA-04088: error during execution of trigger 'SCOTT.AJOUT'

Mise hors-service (non actif) d'un Trigger ALTER TRIGGER mytrigger disable ; -- sous SYS -- (car le trigger appartient à SYS) SQL> ALTER TRIGGER sys.ajout DISABLE; Trigger altered. SQL> insert into sadeg.dept (deptno, dname) values (55, 'D1'); -- maintenant, on peut insérer 1 row created. SQL>

ALTER TABLE matable DISABLE ALL TRIGGERS; ALTER TABLE sadeg.emp DISABLE ALL TRIGGERS; -- On désactive tous les -- triggers sur EMP Table altered. SQL> ALTER TRIGGER tontrigger ENABLE ALTER TRIGGER nostrigger ENABLE ALL TRIGGERS; DROP TRIGGER cetrigger;-- Suppprimer un trigger

La tabe USER_TRIGGERS SQL> desc user_triggers Name Null? Type ----------------------------------------- -------- 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 CROSSEDITION VARCHAR2(7) BEFORE_STATEMENT VARCHAR2(3) BEFORE_ROW VARCHAR2(3) AFTER_ROW VARCHAR2(3) AFTER_STATEMENT VARCHAR2(3) INSTEAD_OF_ROW VARCHAR2(3) FIRE_ONCE VARCHAR2(3) APPLY_SERVER_ONLY VARCHAR2(3) SQL>

Exemple : Auditer un traitement SQL> CREATE TABLE emp2( usr VARCHAR2(32), when DATE, previousvalue VARCHAR2(32), currentvalue VARCHAR2(32) ) / Table created. SQL>

SQL> CREATE OR REPLACE TRIGGER auditer BEFORE UPDATE OF ename ON sadeg.emp FOR EACH ROW DECLARE /* Dans ce trigger, l'instruction INSERT est «commitée» */ PRAGMA AUTONOMOUS_TRANSACTION; BEGIN DBMS_OUTPUT.ENABLE(20000); /*permet d'initialiser le tampon d'écriture et d'accepter les commandes de lecture et d'écriture dans ce tampon */ DBMS_OUTPUT.PUT_LINE(USER ' ' SYSDATE ' ' :NEW.ENAME); INSERT INTO emp2 VALUES(USER,SYSDATE,:OLD.ename,:NEW.ename); COMMIT; EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE(SQLCODE); DBMS_OUTPUT.PUT_LINE(SQLERRM); END; / Trigger created. SQL>

-- se connecter en SYS SQL> update emp set ename = 'sadeg' where empno=7499; 1 row updated. SQL>column usr format A10 SQL> column previousvalue format A10 SQL> column currentvalue format A10 SQL> select * from emp2; USR WHEN PREVIOUSVA CURRENTVAL ---------- --------- ---------- ---------- SYS 02-NOV-14 TOTO sadeg SQL>

Table historique 1/2 SQL> Drop table emp2; SQL> CREATE TABLE emp2 AS SELECT * FROM emp; Table created. SQL> ALTER table emp2 ADD usr VARCHAR2(32); Table altered. SQL>

2/2 CREATE OR REPLACE TRIGGER auditer BEFORE DELETE ON sadeg.emp FOR EACH ROW BEGIN INSERT INTO emp2(empno,ename,job,mgr,hiredate,sal, COMM,DEPTNO,USR) SELECT sadeg.emp.*,user FROM sadeg.emp WHERE sadeg.emp.empno = :OLD.empno; EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE(SQLCODE); DBMS_OUTPUT.PUT_LINE(SQLERRM); END; / Trigger created. SQL>

SQL> select * from emp2; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO USR ---------- ---------- --------- ---------- --------- ---------- ---------- ---------- ---------- 7369 SMITH CLERK 7902 17-DEC-80 800 20 7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30 7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30 7566 JONES MANAGER 7839 02-APR-81 2975 20 7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30 7698 BLAKE MANAGER 7839 01-MAY-81 2850 30 7782 CLARK MANAGER 7839 09-JUN-81 2450 10 7788 SCOTT ANALYST 7566 09-DEC-82 3000 20 7839 Durand PRESIDENT 17-NOV-81 5000 10 7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30 7876 ADAMS CLERK 7788 12-JAN-83 1100 20 7900 JAMES CLERK 7698 03-DEC-81 950 30 7902 FORD ANALYST 7566 03-DEC-81 3000 20 7934 MILLER CLERK 7782 23-JAN-82 1300 10 14 rows selected. SQL>

SQL> delete from sadeg.emp where sadeg.emp.empno = 7369; 1 row deleted. SQL> select * from emp2; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO USR ---------- ---------- --------- ---------- --------- ---------- ---------- ---------- ---------- 7369 SMITH CLERK 7902 17-DEC-80 800 20 7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30 7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30 7566 JONES MANAGER 7839 02-APR-81 2975 20 7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30 7698 BLAKE MANAGER 7839 01-MAY-81 2850 30 7782 CLARK MANAGER 7839 09-JUN-81 2450 10 7788 SCOTT ANALYST 7566 09-DEC-82 3000 20 7839 Durand PRESIDENT 17-NOV-81 5000 10 7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30 7876 ADAMS CLERK 7788 12-JAN-83 1100 20 7900 JAMES CLERK 7698 03-DEC-81 950 30 7902 FORD ANALYST 7566 03-DEC-81 3000 20 7934 MILLER CLERK 7782 23-JAN-82 1300 10 7369 sadeg CLERK 7902 17-DEC-80 800 20 SYS 15 rows selected. SQL