Création de triggers de base de données



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

TP Contraintes - Triggers

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

Le Langage SQL version Oracle

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

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

Bases de données avancées

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

Bases de Données Avancées PL/SQL

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

Gestion des utilisateurs et de leurs droits

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

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

Présentation du PL/SQL

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

1. Introduction Création d'une macro autonome Exécuter la macro pas à pas Modifier une macro... 5

AGRÉGATION «ÉCONOMIE ET GESTION»

Intégrité des données

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

Le Langage De Description De Données(LDD)

Auto-évaluation Oracle: cours de base

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

DirXML License Auditing Tool version Guide de l'utilisateur

Guide de déploiement

Du 10 Fév. au 14 Mars 2014

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

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 Oracle Virtual Private Database (VPD) pour la gestion des utilisateurs d applications

Phone Manager Soutien de l'application OCTOBER 2014 DOCUMENT RELEASE 4.1 SOUTIEN DE L'APPLICATION

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

Devoir Data WareHouse

Asset Management Software Client Module. Manuel d utilisation

Mozaïk. Nouveautés et améliorations. de la version

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

STATISTICA Version 12 : Instructions d'installation

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

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

CA Desktop Migration Manager

Bases de données et sites WEB

Corrigé de l'atelier pratique du module 3 : Récupération d'urgence

Comment Utiliser les Versions, les Modification, les Comparaisons, Dans les Documents

3. La SGA ou System global Area

Base de données II Module 3b

Edutab. gestion centralisée de tablettes Android

Comment Créer une Base de Données Ab Initio

Optimisation SQL. Quelques règles de bases

Qlik Sense Desktop. Qlik Sense Copyright QlikTech International AB. Tous droits réservés.

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

ORACLE TUNING PACK 11G

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

Corrigé de l'atelier pratique du module 8 : Implémentation de la réplication

Historisation des données

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

Création d'un site dynamique en PHP avec Dreamweaver et MySQL

LES ACCES ODBC AVEC LE SYSTEME SAS

Introduction au PL/SQL Oracle. Alexandre Meslé

Département Génie Informatique

CONNECTEUR PRESTASHOP VTIGER CRM

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

Guide d'intégration à ConnectWise

Installation FollowMe Q server

Didacticiel de mise à jour Web

Télécharger et Installer OpenOffice.org sous Windows

Aide en ligne du portail

Tenrox. Guide d intégration Tenrox-Salesforce. Janvier Tenrox. Tous droits réservés.

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

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

Guide de l'utilisateur

Pour valider les pré-requis nécessaires, avant d'aborder le TP, répondez aux questions ciaprès

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

Compétences Business Objects

FileMaker 13. Guide ODBC et JDBC

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

Guide d'utilisation du Serveur USB

COMPOSANTS DE L ARCHITECTURE D UN SGBD. Chapitre 1

Symantec Backup Exec 12.5 for Windows Servers. Guide d'installation rapide

VRM Monitor. Aide en ligne

APIs de table pour SQL Server

Guide de l'utilisateur de l'application mobile

Protocoles DHCP et DNS

SQL Serveur Programme de formation. France Belgique Suisse - Canada. Formez vos salariés pour optimiser la productivité de votre entreprise

Vtiger CRM - Prestashop Connector

et Groupe Eyrolles, 2006, ISBN :

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

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

Acronis Backup & Recovery 10 Advanced Server Virtual Edition. Guide de démarrage rapide

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

Gestion de base de données

Il se peut que certains sites Web ne s'affichent pas correctement ou ne fonctionnent pas dans Internet Explorer 8 ou Internet Explorer 9 Bêta :

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

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

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

2010 Ing. Punzenberger COPA-DATA GmbH. Tous droits réservés.

Créer et partager des fichiers

Administration des bases de données

Transcription:

8 Création de triggers de base de données Copyright Oracle Corporation, 1999. Tous droits réservés.

Objectifs Mostafa HANOUNE 2005/2006 A la fin de ce chapitre, vous serez capables de : Décrire les triggers de base de données, ainsi que leur utilisation Créer des triggers de base de données Décrire des règles de déclenchement pour les triggers de base de données Supprimer des triggers de base de données 8-2 But de ce chapitre Ce chapitre se propose de vous expliquer comment créer et utiliser des triggers de base de données. Développer des unités de programmes PL/SQL 8-2

Présentation des triggers Un trigger est un bloc PL/SQL qui s'exécute implicitement à chaque fois qu'un événement spécifique se produit. Il existe deux types de triggers : les triggers de base de données et les triggers d'application. 8-3 Présentation Les triggers de base de données s'exécutent de manière implicite lorsqu'une instruction INSERT, UPDATE ou DELETE (instruction de déclenchement) est émise sur la table connexe, et ce, quel que soit l'utilisateur connecté ou l'application utilisée. Ils s'exécutent de la même manière lorsque certaines actions se produisent (connexion d'un utilisateur ou fermeture de la base de données par l'administrateur, par exemple). Les triggers d'application s'exécutent de manière implicite lorsqu'un événement déterminé survient au sein de l'application. Les applications développées avec Form Builder font un usage intensif des triggers. Remarque : les triggers de base de données peuvent être définis sur des tables et des vues. Si une opération LMD est effectuée sur une vue, le trigger INSTEAD OF définit les actions qui doivent se produire. Si, au nombre des actions, figurent des opérations LMD sur des tables, tout trigger présent sur la (les) tables(s) de base sera déclenché. Développer des unités de programmes PL/SQL 8-3

Directives relatives à la conception de triggers Vous pouvez concevoir des triggers pour : Exécuter des actions connexes. Centraliser des opérations globales. Leur conception est à proscrire : Si la fonctionnalité existe déjà. Si les triggers que vous comptez créer font double emploi avec d'autres triggers. 8-4 Directives relatives à la conception de triggers Conformez-vous aux directives suivantes pour concevoir des triggers de base de données : Utilisez des triggers pour vous assurer que, lors de l'exécution d'une opération spécifique, les actions connexes seront, elles aussi, exécutées. N'utilisez ces triggers que pour les opérations globales et centralisées devant être déclenchées pour l'instruction de déclenchement, et ce, quel que soit l'utilisateur ou l'application qui a émis l'instruction. Ne définissez pas de triggers censés remplacer ou reproduire une fonctionnalité déjà intégrée dans la base de données Oracle. À titre d'exemple, ne définissez pas de triggers pour implémenter des règles d'intégrité, alors que cela peut être effectué à l'aide de contraintes déclaratives. L'usage abusif de triggers peut provoquer des interdépendances complexes, difficiles à gérer dans des applications volumineuses. Utilisez uniquement les triggers lorsque cela s'avère nécessaire. De plus, prenez garde aux effets récursifs et en cascade. Développer des unités de programmes PL/SQL 8-4

Trigger de base de données : exemple Application SQL> INSERT INTO EMP 2...; Mostafa HANOUNE 2005/2006 Table EMP EMPNO ENAME 7838 KING 7698 BLAKE 7369 SMITH 7788 SCOTT JOB PRESIDENT MANAGER CLERK ANALYST SAL 5000 2850 800 3000 Trigger CHECK_SAL 8-5 Exemple Dans cet exemple, le trigger de base de données vérifie les valeurs relatives aux salaires. Les valeurs qui sortent des limites acceptables en égard à la catégorie d'emploi peuvent être rejetées ou autorisées et enregistrées dans une table d'audit. Développer des unités de programmes PL/SQL 8-5

Création de triggers Temporisation du trigger Pour la table : BEFORE, AFTER Pour la vue : INSTEAD OF Evénement déclencheur : INSERT, UPDATE ou DELETE Nom de la table : sur la table ou la vue Type de trigger : ligne ou instruction Clause "When" : condition restrictive Corps du trigger : bloc PL/SQL Mostafa HANOUNE 2005/2006 8-6 Trigger de base de données Avant de coder le corps du trigger, vous devez définir ses éléments constitutifs : temporisation du trigger, événement déclencheur et type de trigger. Composante Description Valeurs possibles Temporisation du trigger Evénement déclencheur Déclenchement du trigger par rapport à l'événement déclencheur Quelle est l'opération de manipulation de données effectuée sur la table ou la vue qui provoquera le déclenchement du trigger? BEFORE AFTER INSTEAD OF INSERT UPDATE DELETE Type de trigger Nombre d'exécutions du corps du trigger Instruction Ligne Corps du trigger Action effectuée par le trigger Tout le bloc PL/SQL L'ordre dans lequel sont déclenchés plusieurs triggers du même type est totalement arbitraire. Si vous souhaitez que les triggers du même type soient déclenchés dans un ordre déterminé, regroupez-les tous dans un trigger qui appellera les différentes procédures dans l'ordre voulu. Développer des unités de programmes PL/SQL 8-6

Composantes du trigger Mostafa HANOUNE 2005/2006 Temporisation du trigger : quand le trigger doit-il il se déclencher d? BEFORE : exécution du corps du trigger avant le déclenchement de l'événement LMD sur la table. AFTER : exécution du corps du trigger après le déclenchement de l'événement LMD sur la table. INSTEAD OF : exécution du corps du trigger au lieu de l'instruction de déclenchement. Utilisé pour les VUES qui, autrement, ne pourraient être modifiées. 8-7 Triggers BEFORE Ce type de trigger est utilisé fréquemment dans les situations suivantes : Lorsque le trigger doit déterminer si l'instruction de déclenchement doit, ou non, être autorisée à s'exécuter. (Cette situation vous permet d'éviter tout traitement inutile de l'instruction de déclenchement, ainsi que le rollback qui s'ensuit, en cas d'apparition d'une exception dans l'action de déclenchement). Pour obtenir les valeurs de colonne avant d'exécuter une instruction de déclenchement INSERT ou UPDATE. Triggers AFTER Ce type de trigger est utilisé fréquemment dans les situations suivantes : Si vous souhaitez que l'instruction de déclenchement soit terminée avant l'exécution de l'action de déclenchement. S'il existe déjà un trigger BEFORE, et qu'un trigger AFTER peut effectuer différentes actions sur la même instruction de traitement. Triggers INSTEAD OF Ce type de trigger permet de modifier, en toute transparence, des vues qu'il est impossible de modifier directement à l'aide d'instructions LMD SQL en raison de leur nature intrinsèquement non modifiable. Vous pouvez écrire des instructions INSERT, UPDATE et DELETE sur la vue. Le trigger INSTEAD OF s'exécute alors de manière invisible en tâche de fond, et effectue directement sur les tables sous-jacentes l'action codée dans le corps du trigger. Développer des unités de programmes PL/SQL 8-7

Composantes du trigger Evénement utilisateur déclencheur d : Quelle est l'instruction LMD qui va provoquer le déclenchement d du trigger? INSERT UPDATE DELETE 8-8 Evénement utilisateur déclencheur L'instruction ou événement déclencheur peut être une instruction INSERT, UPDATE ou DELETE exécutée sur une table. S'il s'agit d'une instruction UPDATE, vous pouvez inclure une liste de colonnes afin d'identifier la ou les colonnes qui doivent être modifiées pour déclencher le trigger. Cette spécification est impossible dans le cas des instructions INSERT et DELETE, car elles concernent l'ensemble des lignes... UPDATE OF sal... L'événement déclencheur peut contenir plusieurs opérations LMD... INSERT or UPDATE or DELETE... INSERT or UPDATE OF job... Développer des unités de programmes PL/SQL 8-8

Composantes du trigger Type de trigger : Combien de fois le corps du trigger doit-il il s'exécuter lorsque survient l'événement déclencheur? Instruction : par défaut, le corps du trigger s'exécute une seule fois pour l'événement déclencheur. Ligne : le corps du trigger s'exécute une seule fois pour chaque ligne concernée par l'événement déclencheur. 8-9 Triggers d'instruction ou de ligne Vous pouvez spécifier le nombre d'exécutions d'un trigger : une seule fois pour chaque ligne concernée par l'instruction de déclenchement (telle qu'une mise à jour, UPDATE, de plusieurs lignes) ou une seule fois pour l'instruction de déclenchement, quel que soit le nombre de lignes affectées. Trigger d'instruction Un trigger d'instruction est exécuté pour le compte de l'événement déclencheur, et ce, même si aucune ligne n'a été affectée. Ce type de trigger s'avère particulièrement utile si l'action ne dépend pas des données des lignes concernées, ni des données fournies par l'événement déclencheur proprement dit. Il peut s'agir, par exemple, d'un trigger exécutant un contrôle de sécurité complexe sur l'utilisateur courant. Trigger de ligne Un trigger de ligne se déclenche à chaque fois que la table est affectée par l'événement déclencheur. Si cet événement n'affecte aucune ligne, aucune exécution n'aura lieu. Ce type de trigger s'avère particulièrement utile si l'action dépend des données des lignes concernées ou des données fournies par l'événement déclencheur proprement dit. Développer des unités de programmes PL/SQL 8-9

Composantes du trigger Corps du trigger : Quelle action le trigger doit-il il effectuer? Le corps du trigger est un bloc PL/SQL ou un appel vers une procédure. 8-10 Corps du trigger L'action du trigger définit les mesures à prendre en cas d'apparition de l'événement déclencheur. Le bloc PL/SQL peut contenir des instructions SQL et PL/SQL, définir des structures PL/SQL telles que des variables, curseurs, exceptions, etc. Vous pouvez également appeler une procédure PL/SQL ou Java. Il convient encore d'ajouter que les triggers de ligne ont recours à des noms de corrélation pour accéder aux valeurs de colonne, anciennes ou nouvelles, de la ligne en cours de traitement. Développer des unités de programmes PL/SQL 8-10

Action responsable du déclenchementd DEPTNO 10 20 30 40 Séquence de déclenchement Instruction LMD SQL> INSERT INTO dept (deptno, dname, loc) 2 VALUES (50, 'EDUCATION', 'NEW YORK'); DNAME ACCOUNTING RESEARCH SALES OPERATIONS LOC NEW YORK DALLAS CHICAGO BOSTON Mostafa HANOUNE 2005/2006 Séquence de déclenchement d d'un trigger sur une table, manipulation d'une seule ligne : Trigger d'instruction BEFORE Trigger de ligne BEFORE Trigger de ligne AFTER Trigger d'instruction AFTER 8-11 Triggers d'instruction ou de ligne. Que choisir? Vous pouvez créer un trigger d'instruction ou un trigger de ligne en vous basant sur la condition prévoyant un déclenchement pour chacune des lignes affectées par l'instruction de déclenchement ou un déclenchement unique pour l'instruction, quel que soit le nombre de lignes affectées. Si l'instruction de manipulation de données à la base du déclenchement concerne une seule ligne, les triggers d'instruction et de ligne sont, tous deux, déclenchés à une seule reprise. Exemple Cette instruction SQL ne fait pas la distinction entre les triggers d'instruction et de ligne. Cela est dû au fait qu'une seule et unique ligne a été insérée dans la table au moyen de cette syntaxe. Développer des unités de programmes PL/SQL 8-11

Séquence de déclenchement Mostafa HANOUNE 2005/2006 Séquence de déclenchement d d'un trigger sur une table, manipulation de plusieurs lignes : SQL> UPDATE emp 2 SET sal = sal * 1.1 3 WHERE deptno = 30; EMPNO 7839 7698 7788 ENAME KING BLAKE SMITH DEPTNO 30 30 30 Trigger d'instruction BEFORE Trigger de ligne BEFORE Trigger de ligne AFTER Trigger de ligne BEFORE Trigger de ligne AFTER Trigger de ligne BEFORE Trigger de ligne AFTER Trigger d'instruction AFTER 8-12 Création de triggers d'instruction ou de ligne Si l'instruction de manipulation de données à la base du déclenchement concerne plusieurs lignes, le trigger d'instruction se déclenche à une seule reprise. Quant au trigger de ligne, il s'exécute une fois pour chacune des lignes affectées. Exemple Avec l'instruction SQL de cette diapositive, le nombre de déclenchements du trigger de niveau ligne correspond au nombre de lignes répondant à la clause WHERE (en l'occurrence, le nombre d'employés appartenant au département 30). Développer des unités de programmes PL/SQL 8-12

Syntaxe relative à la création des triggers d'instruction CREATE [OR REPLACE] TRIGGER trigger_name timing event1 [OR event2 OR event3] ON table_name trigger_body 8-13 Syntaxe relative à la création d'un trigger d'instruction trigger name timing event table/ view_name trigger body Nom du trigger. Indique le moment où le trigger se déclenchera par rapport à l'événement déclencheur : BEFORE (avant) AFTER (après) Identifie l'opération de manipulation de données à la base du déclenchement du trigger : INSERT UPDATE [OF colonne] DELETE Spécifie la table associée au trigger. Il s'agit du corps de trigger définissant l'action exécutée par le trigger. Il commence par DECLARE ou BEGIN et se termine par END ou un appel vers une procédure (voir chapitre 9) Développer des unités de programmes PL/SQL 8-13

Création de triggers d'instruction à l'aide de SQL*Plus Mostafa HANOUNE 2005/2006 SQL> CREATE OR REPLACE TRIGGER secure_emp 2 BEFORE INSERT ON emp 3 BEGIN 4 IF (TO_CHAR (sysdate,'dy') IN ('SAT','SUN')) OR 5 (TO_CHAR(sysdate,'HH24') NOT BETWEEN 6 '08' AND '18') 7 THEN RAISE_APPLICATION_ERROR (-20500, 8 'You may only insert into EMP during normal hours.'); 9 END IF; 10 END; 11 / 8-14 Triggers d'instruction dans SQL*Plus Vous pouvez créer un trigger d'instruction BEFORE afin d'empêcher l'aboutissement d'une opération de déclenchement si une certaine condition est enfreinte. Vous pouvez créer un trigger chargé de limiter à certaines heures ouvrables, du lundi au vendredi, les insertions effectuées dans la table EMP. Si, par exemple, un utilisateur tente d'insérer une ligne un dimanche, un message apparaît, le trigger échoue et l'instruction de déclenchement est annulée. RAISE_APPLICATION_ERROR est une procédure intégrée côté serveur qui imprime un message à l'attention de l'utilisateur et provoque l'échec du bloc PL/SQL. En cas d'échec d'un trigger de base de données, Oracle Server annule automatiquement l'instruction de déclenchement. Développer des unités de programmes PL/SQL 8-14

Création de triggers d'instruction à l'aide de Procedure Builder 8-15 Procédure de création d'un trigger d'instruction à l'aide de Procedure Builder Il est possible de créer le même trigger d'instruction BEFORE dans Procedure Builder. 1. Connectez-vous à la base de données. 2. Cliquez sur le nœud "Database Objects" dans le navigateur d'objets. 3. Sélectionnez l'éditeur "Database Trigger" dans le menu des programmes. 4. Sélectionnez un propriétaire de table, ainsi qu'une table, dans les listes déroulantes "Table owner" et "Table". 5. Cliquez sur "New" pour lancer la création du trigger. 6. Cliquez sur l'un des boutons de la zone "Triggering" pour choisir le composant temporisation. 7. Sélectionnez "Statement" pour choisir le composant événement. 8. Entrez le code du trigger dans la zone "Trigger Body". 9. Cliquez sur "Save". Votre trigger va être compilé par le moteur PL/SQL du serveur. Une fois la compilation terminée avec succès, votre trigger est stocké dans la base de données et activé automatiquement. Remarque : si le trigger rencontre des erreurs de compilation, un message d'erreur s'affiche dans une fenêtre distincte. Développer des unités de programmes PL/SQL 8-15

Test de SECURE_EMP SQL> INSERT INTO emp (empno, ename, deptno) 2 VALUES (7777, 'BAUWENS', 40); INSERT INTO emp (empno, ename, deptno) * ERROR at line 1: ORA-20500: You may only insert into EMP during normal hours. ORA-06512: at "A_USER.SECURE_EMP", line 4 ORA-04088: error during execution of trigger 'A_USER.SECURE_EMP' 8-16 Exemple Tentative d'insertion d'une ligne dans la table EMP en dehors des heures de bureau. Développer des unités de programmes PL/SQL 8-16

Utilisation de prédicats conditionnels CREATE OR REPLACE TRIGGER secure_emp BEFORE INSERT OR UPDATE OR DELETE ON emp BEGIN IF (TO_CHAR (sysdate,'dy') IN ('SAT','SUN')) OR (TO_CHAR (sysdate, 'HH24') NOT BETWEEN '08' AND '18') THEN IF DELETING THEN RAISE_APPLICATION_ERROR (-20502, 'You may only delete from EMP during normal hours.'); ELSIF INSERTING THEN RAISE_APPLICATION_ERROR (-20500, 'You may only insert into EMP during normal hours.'); ELSIF UPDATING ('SAL') THEN RAISE_APPLICATION_ERROR (-20503, 'You may only update SAL during normal hours.'); ELSE RAISE_APPLICATION_ERROR (-20504, 'You may only update EMP during normal hours.'); END IF; END IF; END; 8-17 Combinaison d'événements déclencheurs Il est possible de rassembler plusieurs événements déclencheurs au sein d'un seul événement grâce aux prédicats conditionnels spéciaux INSERTING, UPDATING et DELETING disponibles dans le corps du trigger. Exemple Créez un trigger pour empêcher l'exécution de tout événement de manipulation de données sur la table EMP en dehors de certaines heures ouvrables, du lundi au vendredi. Faites également appel aux triggers d'instruction BEFORE pour initialiser des variables ou indicateurs globaux et valider les règles de gestion complexes. Développer des unités de programmes PL/SQL 8-17

Création d'un trigger de ligne CREATE [OR REPLACE] TRIGGER trigger_name timing event1 [OR event2 OR event3] ON table_name [REFERENCING OLD AS old NEW AS new] FOR EACH ROW [WHEN condition] trigger_body 8-18 Syntaxe relative à la création d'un trigger de ligne trigger_name timing event table_name REFERENCING FOR EACH ROW WHEN trigger body Nom du trigger Indique le moment où le trigger se déclenchera par rapport à l'événement déclencheur: BEFORE (avant) AFTER (après) Identifie l'opération de manipulation de données à la base du déclenchement du trigger : INSERT UPDATE [OF colonne ] DELETE Indique la table associée au trigger. Spécifie les noms de corrélation des anciennes et nouvelles valeurs de la ligne courante (les valeurs par défaut sont OLD et NEW). Désigne le trigger en tant que trigger de ligne. Spécifie la restriction au niveau du trigger. (Ce prédicat conditionnel est évalué pour chaque ligne afin de déterminer si le corps du trigger,doit ou non, être exécuté). Il s'agit du corps de trigger définissant l'action exécutée par le trigger. Il commence par DECLARE ou BEGIN et se termine par END ou un appel vers une procédure. Développer des unités de programmes PL/SQL 8-18

Création de triggers de ligne à l'aide de SQL*Plus SQL> CREATE OR REPLACE TRIGGER CHECK_SALARY 2 BEFORE INSERT OR UPDATE OF sal ON emp 3 FOR EACH ROW 4 BEGIN 5 IF NOT (:NEW.JOB IN ('MANAGER', 'PRESIDENT')) 6 AND :NEW.SAL > 5000 7 THEN 8 RAISE_APPLICATION_ERROR 9 (-20202, 'EMPLOYEE CANNOT EARN THIS AMOUNT'); 10 END IF; 11 END; 8-19 Création d'un trigger de ligne dans SQL*Plus Vous pouvez créer un trigger de ligne BEFORE afin d'empêcher l'aboutissement d'une opération de déclenchement si une certaine condition est enfreinte. Créez un trigger permettant uniquement à certains employés d'avoir un salaire supérieur à 5000 unités. Si un utilisateur tente d'enfreindre cette condition, le trigger génère une erreur. SQL> UPDATE EMP SET SAL = 6500 WHERE ENAME = 'MILLER' 2 / UPDATE EMP SET SAL = 6500 WHERE ENAME = 'MILLER' * ERROR at line 1: ORA-20202: EMPLOYEE CANNOT EARN THIS AMOUNT ORA-06512: at "A_USER.CHECK_SALARY, line 5 ORA-04088: error during execution of trigger 'A_USER.CHECK_SALARY Développer des unités de programmes PL/SQL 8-19

Création de triggers de ligne à l'aide de Procedure Builder 8-20 Procédure de création d'un trigger de ligne à l'aide de Procedure Builder Il est possible de créer le même trigger d'instruction BEFORE dans Procedure Builder. 1. Connectez-vous à la base de données. 2. Cliquez sur le nœud "Database Objects" dans le navigateur d'objets. 3. Sélectionnez l'éditeur "Database Trigger" dans le menu des programmes. 4. Sélectionnez un propriétaire de table, ainsi qu'une table, dans les listes déroulantes correspondantes. 5. Cliquez sur "New" pour lancer la création du trigger. 6. Cliqueez sur l un des boutons de la zone "Triggering" pour choisir le composant temporisation. 7. Cochez les cases "Statement" pour sélectionner le composant Evénements. 8. Dans la zone "For Each", cliquez sur le bouton "Row option" afin de désigner le trigger comme étant de type "ligne". 9. Renseignez les champs Referencing "OLD as" et "NEW as" si vous souhaitez modifier les noms de corrélation. Dans le champ When, entrez une condition When pour limiter l'exécution du trigger. Ces champs sont facultatifs et ne sont disponibles qu'avec les triggers ROW. 10. Entrez le code du trigger. 11. Cliquez sur "Save". Votre trigger va être compilé par le moteur PL/SQL du serveur. Une fois la compilation terminée avec succès, votre trigger est stocké dans la base de données et activé automatiquement. Développer des unités de programmes PL/SQL 8-20

Utilisation des qualificatifs OLD et NEW SQL>CREATE OR REPLACE TRIGGER audit_emp_values 2 AFTER DELETE OR INSERT OR UPDATE ON emp 3 FOR EACH ROW 4 BEGIN 5 INSERT INTO audit_emp_table (user_name, 6 timestamp, id, old_last_name, new_last_name, 7 old_title, new_title, old_salary, new_salary) 8 VALUES (USER, SYSDATE, :OLD.empno, :OLD.ename, 9 :NEW.ename, :OLD.job, :NEW.job, 10 :OLD.sal, :NEW.sal ); 11 END; 12 / 8-21 Utilisation des qualificatifs OLD et NEW : exemple Vous pouvez créer un trigger sur la table EMP afin d'ajouter des lignes dans une table utilisateur, AUDIT_EMP_TABLE, et consigner ainsi les activités d'un utilisateur relativement à ladite table. Le trigger enregistre les valeurs de plusieurs colonnes avant et après les modifications de données. Pour ce faire, il utilise les qualificatifs OLD et NEW avec le nom de colonne approprié. Développer des unités de programmes PL/SQL 8-21

Audit_Emp_Table Mostafa HANOUNE 2005/2006 USER_NAME TIMESTAMP ID OLD_LAST_NAME NEW_LAST_NAME EGRAVINA 12-NOV-97 NULL NULL HUTTON NGREENBE 10-DEC-97 7844 MAGEE TURNER Suite OLD_TITLE NEW_TITLE OLD_SALARY NEW_SALARY NULL ANALYST NULL 3500 CLERK SALESMAN 1100 1100 8-22 Utilisation des qualificatifs OLD et NEW Dans un trigger ROW, faites référence à la valeur d'une colonne avant et après la modification des données en la faisant précéder du qualificatif OLD ou NEW. Opération de données Ancienne valeur (OLD) Nouvelle valeur (NEW) INSERT NULL (néant) Valeur insérée UPDATE Valeur avant mise à jour Valeur après mise à jour DELETE Valeur avant suppression NULL (néant) Les qualificatifs OLD et NEW sont disponibles uniquement dans les triggers ROW. Dans toute instruction SQL et PL/SQL, faites précéder les qualificatifs de deux points (:). Ne pas utiliser le préfixe (:) quand les qualificatifs sont référencés dans la condition de restriction WHEN. Développer des unités de programmes PL/SQL 8-22

Restriction d'un trigger de ligne SQL>CREATE OR REPLACE TRIGGER derive_commission_pct 2 BEFORE INSERT OR UPDATE OF sal ON emp 3 FOR EACH ROW 4 WHEN (NEW.job = 'SALESMAN') 5 BEGIN 6 IF INSERTING 7 THEN :NEW.comm := 0; 8 ELSIF :OLD.comm IS NULL 9 THEN :NEW.comm := 0; 10 ELSE :NEW.comm := :OLD.comm * (:NEW.sal/:OLD.sal); 11 END IF; 12 END; 13 / 8-23 Exemple La clause WHEN permet de limiter l'action du trigger aux lignes qui répondent à une certaine condition. Créez un trigger sur la table EMP pour calculer la commission d'un employé lors de l'ajout d'une ligne dans une table EMP ou de la modification du salaire d'un employé. Le qualificatif NEW ne doit pas être précédé de deux points dans la clause WHEN. Développer des unités de programmes PL/SQL 8-23

Trigger INSTEAD OF Application Mostafa HANOUNE 2005/2006 SQL> INSERT INTO my_view 2...; MY_VIEW Trigger INSTEAD OF INSERT TABLE1 UPDATE TABLE2 8-24 Triggers INSTEAD OF Les triggers INSTEAD OF vous permettent de modifier les données lorsqu une instruction LMD a été émise relativement à une vue intrinsèquement non modifiable. On parle, dans ce cas, de "triggers INSTEAD OF" car, contrairement aux autres triggers, Oracle Server les déclenche au lieu d'exécuter l'instruction de déclenchement. Ce type de trigger sert à effectuer une opération INSERT, UPDATE ou DELETE directement sur les tables sous-jacentes. Supposons que vous écriviez des instructions INSERT, UPDATE ou DELETE sur une vue. Dans ce cas, le trigger INSTEAD OF s'exécute de manière invisible en tâche de fond afin de permettre l'exécution des actions appropriées. Pourquoi utiliser des triggers INSTEAD OF? Si une vue comprend plusieurs tables, une insertion effectuée dans la vue pourrait entraîner une insertion dans une table et une mise à jour dans une autre. Vous pouvez donc écrire un trigger INSTEAD OF qui se déclenchera lorsque vous créez une insertion sur la vue. Le cas échéant, le corps du trigger s'exécute en lieu et place de l'insertion originale, ce qui se traduit par une insertion dans une table et une mise à jour dans une autre. Développer des unités de programmes PL/SQL 8-24

Création d'un trigger INSTEAD OF Mostafa HANOUNE 2005/2006 CREATE [OR REPLACE] TRIGGER trigger_name INSTEAD OF event1 [OR event2 OR event3] ON view_name [REFERENCING OLD AS old NEW AS new] [FOR EACH ROW] trigger_body 8-25 Syntaxe relative à la création d'un trigger INSTEAD OF trigger_name INSTEAD OF event view_name REFERENCING [FOR EACH ROW] trigger body Nom du trigger. Indique que le trigger sera destiné à une vue. Identifie l'opération de manipulation de données à la base du déclenchementdu : trigger INSERT UPDATE [OF colonne ] DELETE Indique la vue associée au trigger. Spécifie les noms de corrélation des anciennes et nouvelles valeurs de la ligne courante (les valeurs par défaut sont OLD et NEW). Désigne le trigger en tant que trigger de ligne. Les triggers INSTEAD OF sont toujours des triggers de ligne. Ce paramètre est facultatif. Il s'agit du corps de trigger définissant l'action exécutée par le trigger. Il commence par DECLARE ou BEGIN et se termine par END ou un appel vers une procédure. Développer des unités de programmes PL/SQL 8-25

Création d'un trigger INSTEAD OF INSERT INTO EMP_DETAILS (EMPNO, ENAME, SAL, DEPTNO) VALUES (9001,'ABBOTT',1000,10) INSTEAD OF INSERT dans EMP_DETAILS EMPNO 7836 7782 7934 7566 ENAME KING CLARK MILLER JONES SAL 5000 2450 1300 2975 DEPTNO 10 10 10 20 DNAME NEW YORK NEW YORK NEW YORK DALLAS TOT_DEPT_SAL 8750 8750 8750 10875 INSERT dans EMPLOYEES EMPNO 7939 7698 7782 9001 ENAME KING BLAKE CLARK ABBOTT SAL 5000 2850 2450 1000 UPDATE DEPARTMENTS DEPTNO DNAME 10 ACCOUNTING 20 RESEARCH 30 SALES TOT_DEPT_SAL 9750 10875 9400 8-26 Création d'un trigger INSTEAD OF Vous pouvez créer un trigger INSTEAD OF en vue de gérer les tables de base sur lesquelles repose la vue. Supposons que vous souhaitiez insérer le nom d'un employé à l'aide de la vue. Dans ce cas, créez un trigger qui provoquera l'insertion (INSERT) appropriée et la mise à jour (UPDATE) des tables de base. Développer des unités de programmes PL/SQL 8-26

Tableau comparatif Triggers / Procédures stockées Triggers Utilisation de CREATE TRIGGER Le dictionnaire de données contient le code source et le p-code Appel implicite Commandes COMMIT, SAVEPOINT, ROLLBACK non autorisées Procédure Utilisation de CREATE PROCEDURE Le dictionnaire de données contient le code source et le p-code Appel explicite Commandes COMMIT, SAVEPOINT, ROLLBACK autorisées 8-27 Triggers de base de données et procédures stockées Voici un tableau comparatif des triggers de base de données et procédures stockées : Trigger de base de données Appel implicite. Les instructions COMMIT, ROLLBACK et SAVEPOINT ne sont pas autorisées dans le corps du trigger. Procédure stockée Appel explicite. Les instructions COMMIT, ROLLBACK et SAVEPOINT sont autorisées dans le corps de la procédure. Les triggers sont entièrement compilés lors de l'émission de la commande CREATE TRIGGER. Le pseudo-code (p-code) est, lui, stocké dans le dictionnaire de données. Par conséquent, le déclenchement du trigger ne nécessite plus l'ouverture d'un curseur partagé pour exécuter l'action du trigger. Au lieu de cela, le trigger est exécuté directement. La génération d'erreurs lors de la compilation du trigger n'empêche pas la création de celui-ci. Développer des unités de programmes PL/SQL 8-27

Comparaison entre les triggers de base de données et les triggers Form Builder SQL> INSERT INTO EMP 2...; Table EMP EMPNO ENAME 7838 KING 7698 BLAKE 7369 SMITH 7788 SCOTT JOB PRESIDENT MANAGER CLERK ANALYST SAL 5000 2850 800 3000 Trigger CHECK_SAL Ligne BEFORE INSERT 8-28 Comparaison entre les triggers de base de données et les triggers Form Builder Il est important de faire la distinction entre les triggers de base de données et les triggers Form Builder. Trigger de base de données Exécuté par des actions à partir de n'importe quel outil ou application de base de données Le déclenchement est toujours dû à une instruction SQL LMD ou LDD, ou à une certaine action de base de données Distinction entre trigger d'instruction et de ligne En cas d'échec, il provoque l'annulation de l'instruction de déclenchement Le déclenchement s'effectue indépendamment, et en plus, des triggers Form Builder Exécution sous le domaine de sécurité du créateur du trigger Trigger Form Builder Exécuté uniquement au sein d'une application Form Builder particulière Le déclenchement peut s'effectuer en passant d'un champ à un autre, en appuyant sur une touche ou en effectuant bien d'autres actions Distinction entre trigger d'instruction et de ligne En cas d'échec, il provoque le blocage du curseur et, éventuellement, l'annulation de toute la transaction Le déclenchement s'effectue indépendamment, et en plus, des triggers de base de données Exécution sous le domaine de sécurité de l'utilisateur Form Builder Développer des unités de programmes PL/SQL 8-28

Gestion des triggers Mostafa HANOUNE 2005/2006 Désactivation ou réactivation r d'un trigger de base de données : ALTER TRIGGER trigger_name DISABLE ENABLE Désactivation ou réactivation r de tous les triggers d'une table : ALTER TABLE table_name DISABLE ENABLE ALL TRIGGERS Recompilation d'un trigger pour une table : ALTER TRIGGER trigger_name COMPILE 8-29 Modes du trigger : Activé ou Désactivé Lors de sa création, le trigger est activé automatiquement. Dans le cas des triggers activés, Oracle Server vérifie les contraintes d'intégrité et s'assure que les triggers ne pourront y porter atteinte. De surcroît, Oracle Server fournit des vues à lecture cohérente pour les requêtes et les contraintes, il gère les dépendances et propose une validation à deux phases si un trigger met à jour des tables distantes dans une base de données répartie. Utilisez la syntaxe ALTER TRIGGER pour désactiver un trigger spécifique ou ALTER TABLE pour désactiver tous les triggers d'une table. Certains utilitaires, tels que SQL*Loader, permettent de désactiver un trigger. Cette décision peut être motivée par le désir d'améliorer les performances ou d'éviter les contrôles d'intégrité lors du chargement de grandes quantités de données. Il se peut également que vous souhaitiez désactiver un trigger si celui-ci fait référence à un objet de base de données actuellement indisponible en raison d'un échec de connexion réseau, d'un incident de disque ou encore d'un fichier de données ou d'un tablespace offline. Compilation d'un trigger Utilisez la commande ALTER TRIGGER pour recompiler explicitement un trigger non valide. Lorsque vous émettez une instruction ALTER TRIGGER avec l'option COMPILE, la recompilation est effectuée, et ce, que le trigger soit valide ou non. Développer des unités de programmes PL/SQL 8-29

Syntaxe DROP TRIGGER Pour supprimer un trigger de la base de données, utilisez la syntaxe DROP TRIGGER : DROP TRIGGER trigger_name Exemple SQL> DROP TRIGGER secure_emp; Trigger dropped 8-30 Suppression de triggers Lorsqu'un trigger est devenu inutile, vous pouvez utiliser une instruction SQL dans la fenêtre de l'interpréteur Procedure Builder ou SQL*Plus pour le supprimer (DROP). Développer des unités de programmes PL/SQL 8-30

Test des triggers Mostafa HANOUNE 2005/2006 Testez toutes les opérations de déclenchement, ainsi que celles ne donnant pas lieu au déclenchement du trigger Testez chaque cas de la clause WHEN Provoquez le déclenchement direct du trigger grâce d'une opération «basique» sur les données, et indirect via une procédure Testez l'incidence de votre trigger sur d'autres triggers Testez l'incidence des autres triggers sur votre trigger 8-31 Test des triggers Vérifiez le bon fonctionnement du trigger en analysant séparément différents cas de figure. Utilisez les procédures DBMS_OUTPUT pour déboguer les triggers. Développer des unités de programmes PL/SQL 8-31

Modèle d'exécution des triggers et vérification des contraintes 1. Exécuter tous les triggers BEFORE STATEMENT 2. Effectuer une boucle pour toutes les lignes affectées es a. Exécuter tous les triggers BEFORE ROW b. Exécuter l'instruction LMD et effectuez une vérification de la contrainte d'intégrité c. Exécuter tous les triggers AFTER ROW 3. Exécuter tous les triggers AFTER STATEMENT 8-32 Modèle d'exécution d'un trigger Une seule instruction LMD est susceptible de déclencher jusqu'à quatre types de triggers : BEFORE et AFTER, de type instruction ou ligne. Au sein du trigger, une instruction ou un événement déclencheur peut entraîner le contrôle d'une ou de plusieurs contraintes d'intégrité. Des triggers peuvent également provoquer le déclenchement d'autres triggers (on parle alors de triggers en cascade). Toutes les actions et vérifications effectuées consécutivement à une instruction SQL doivent aboutir. Si une exception est déclenchée dans un trigger et que celle-ci n'est pas traitée explicitement, toutes les actions exécutées à cause de l'instruction SQL originale sont annulées, y compris celles effectuées par les triggers déclencheurs. Cela vous donne la garantie que les triggers ne porteront jamais atteinte aux contraintes d'intégrité. En cas de contrainte différée, la vérification de la contrainte se fait lors du COMMIT. Développer des unités de programmes PL/SQL 8-32

LMD dans EMP Démonstration type AUDIT_EMP_TRIG POUR CHAQUE LIGNE Incrémenter variables Package VAR_PACK Mostafa HANOUNE 2005/2006 AUDIT_EMP_TAB APRES L INSTRUCTIONL Copier puis Réinitialiser R les variables AUDIT_TABLE 8-33 Démonstration type Les pages de sous-programmes PL/SQL suivantes illustrent l'intéraction existant entre les triggers, procédures packagées, fonctions et variables globales. Exemple Ordre des événements : 1. Vous émettez une commande INSERT, UPDATE ou DELETE capable de manipuler une ou plusieurs lignes. 2. AUDIT_EMP_TRIG, le trigger AFTER de niveau ligne, appelle la procédure packagée en vue d'incrémenter les variables globales du package VAR_PACK. Etant donné qu'il s'agit d'un trigger de ligne, la mise à jour de trois lignes aurait entraîné trois déclenchements. 3. Une fois l'instruction exécutée, AUDIT_EMP_TAB, le trigger AFTER de niveau instruction, appelle la procédure AUDIT_EMP. Celle-ci affecte les valeurs des variables globales dans les variables locales au moyen des fonctions du package, elle met à jour la table AUDIT_TABLE, puis réinitialise les variables globales. Développer des unités de programmes PL/SQL 8-33

Démonstration : triggers Mostafa HANOUNE 2005/2006 CREATE OR REPLACE TRIGGER audit_emp_trig AFTER UPDATE or INSERT or DELETE on EMP FOR EACH ROW BEGIN IF DELETING THEN var_pack.set_g_del(1); ELSIF INSERTING THEN var_pack.set_g_ins(1); ELSIF UPDATING ('SAL') THEN var_pack.set_g_up_sal(1); ELSE var_pack.set_g_upd(1); END IF; END audit_emp_trig; CREATE OR REPLACE TRIGGER audit_emp_tab AFTER UPDATE or INSERT or DELETE on EMP BEGIN audit_emp; END audit_emp_tab; 8-34 Instruction AFTER et triggers ligne AFTER AUDIT_EMP_TRIG sera déclenché après la manipulation d'une ligne. Le trigger incrémente les variables globales qui consignent le nombre de lignes modifiées. AUDIT_EMP_TAB sera déclenché une fois l'instruction exécutée. Le trigger appelle la procédure AUDIT_EMP présentée plus loin. Développer des unités de programmes PL/SQL 8-34

Démonstration : spécification du package VAR_PACK CREATE OR REPLACE PACKAGE var_pack IS -- these functions are used to return the -- values of package variables FUNCTION g_del RETURN NUMBER; FUNCTION g_ins RETURN NUMBER; FUNCTION g_upd RETURN NUMBER; FUNCTION g_up_sal RETURN NUMBER; -- these procedures are used to modify the -- values of the package variables PROCEDURE set_g_del (p_val IN NUMBER); PROCEDURE set_g_ins (p_val IN NUMBER); PROCEDURE set_g_upd (p_val IN NUMBER); PROCEDURE set_g_up_sal (p_val IN NUMBER); END var_pack; 8-35 Corps du package VAR_PACK CREATE OR REPLACE PACKAGE BODY var_pack IS gv_del NUMBER := 0; gv_ins NUMBER := 0; gv_upd NUMBER := 0; gv_up_sal NUMBER := 0; FUNCTION g_del RETURN NUMBER IS BEGIN RETURN gv_del; END; FUNCTION g_ins RETURN NUMBER IS BEGIN RETURN gv_ins; END; FUNCTION g_upd RETURN NUMBER IS BEGIN RETURN gv_upd; END; FUNCTION g_up_sal RETURN NUMBER IS BEGIN RETURN g_up_sal; END; PROCEDURE set_g_del (p_val IN NUMBER) IS BEGIN IF p_val = 0 THEN gv_del := p_val; ELSE gv_del := gv_del +1; END IF; END set_g_del; PROCEDURE set_g_ins (p_val IN NUMBER) IS BEGIN IF p_val = 0 THEN gv_ins := p_val; ELSE gv_ins := gv_ins +1; END IF; END set_g_ins; PROCEDURE set_g_upd (p_val IN NUMBER) IS BEGIN IF p_val = 0 THEN gv_upd := p_val; ELSE gv_upd := gv_upd +1; END IF; END set_g_upd; PROCEDURE set_g_up_sal (p_val IN NUMBER) IS BEGIN IF p_val = 0 THEN gv_up_sal := p_val; ELSE gv_up_sal := gv_up_sal +1; END IF; END set_g_up_sal; END var_pack; Développer des unités de programmes PL/SQL 8-35

8-36 Démonstration : procédure Mostafa HANOUNE 2005/2006 CREATE OR REPLACE PROCEDURE audit_emp IS v_del NUMBER := var_pack.g_del; v_ins NUMBER := var_pack.g_ins; v_upd NUMBER := var_pack.g_upd; v_up_sal NUMBER := var_pack.g_up_sal; BEGIN IF v_del + v_ins + v_upd!= 0 THEN UPDATE audit_table SET del = del + v_del, ins = ins + v_ins, upd = upd + v_upd WHERE user_name = user AND tablename = 'EMP' AND column_name IS NULL; END IF; IF v_up_sal!= 0 THEN UPDATE audit_table SET upd = upd + v_up_sal WHERE user_name = user AND tablename = 'EMP' AND column_name = 'SAL'; END IF; -- resetting global variables in package VAR_PACK var_pack.set_g_del (0); var_pack.set_g_ins (0); var_pack.set_g_upd (0); var_pack.set_g_up_sal (0); END audit_emp; Mise à jour de AUDIT_TABLE à l'aide de la procédure AUDIT_EMP La procédure AUDIT_EMP met à jour la table AUDIT_TABLE et appelle les procédures du package VAR_PACK responsables de la réinitialisation des variables globales, assurant ainsi sa préparation pour l'instruction LMD suivante. Développer des unités de programmes PL/SQL 8-36

Résumé Mostafa HANOUNE 2005/2006 Procédure Package Trigger xxxxxxxxxxxxxxxxxx vvvvvvvvvvvvvvvvvv xxxxxxxxxxxxxxxxxx vvvvvvvvvvvvvvvvvv xxxxxxxxxxxxxxxxxx vvvvvvvvvvvvvvvvvv xxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxx vvvvvvvvvvvvvvvvvv xxxxxxxxxxxxxxxxxx vvvvvvvvvvvvvvvvvv xxxxxxxxxxxxxxxxxx vvvvvvvvvvvvvvvvvv xxxxxxxxxxxxxxxxxx Déclaration de la procédure A Définition de la procédure B Définition de la procédure A Variable locale 8-37 Vous pouvez développer plusieurs types de structures de base de données procédurales en fonction du type d'utilisation. Structure Procédure Package Trigger Utilisation Bloc de programmation PL/SQL stocké dans la base de données en vue d'une exécution itérative. Groupe de procédures, fonctions, variables curseurs, constantes et exceptions connexes. Bloc de programmation PL/SQL exécuté implicitement par une instruction de manipulation de données. Développer des unités de programmes PL/SQL 8-37

Présentation des exercices Création de triggers de ligne et d'instruction Création de triggers avancés en vue d'accroître les fonctionnalités de la base de données Oracle 8-38 Présentation des exercices Vous pouvez effectuer ces exercices à l'aide de SQL*Plus ou Procedure Builder. Si vous obtenez des erreurs de compilation avec SQL*Plus, utilisez la commande SHOW ERRORS. Toute erreur de compilation corrigée dans SQL*Plus devra également l'être dans le script original, et non dans le buffer. Vous devrez ensuite réexécuter la nouvelle version du fichier. Cela aura pour effet d'enregistrer une nouvelle version du package dans le dictionnaire de données. Développer des unités de programmes PL/SQL 8-38

Exercice 8 1. La modification des données des tables ne sera autorisée que pendant les heures de bureau normales, c'est-à-dire de 8H45 à 17H30, du lundi au vendredi. a. Si vous créez une procédure stockée nommée SECURE_DML se produisant en dehors de ces heures, le système retournera le message suivant : Vous ne pouvez changer les données que pendant les horaires de bureau normaux. 2. Créez, dans la table PRODUCT, un trigger d'instruction appelant la procédure ci-dessus. a. Testez la procédure en modifiant, temporairement, les heures qui y sont indiquées et en tâchant d'insérer un nouvel enregistrement dans la table PRODUCT. Une fois le test effectué, réinitialisez les heures de la procédure ainsi qu'il est mentionné au point 1. S'il vous reste du temps : 3. La commission d'un vendeur doit être modifiée pour toute nouvelle commande ou modification apportée aux commandes existantes. Cette valeur est stockée dans la colonne COMM de la table EMP. Un vendeur est affecté à un client donné dans la table CUSTOMER. a. Créez une procédure chargée de mettre à jour la commission du vendeur en question. Faites usage des paramètres pour accepter l'id client, le total de l'ancienne commande et le total de la nouvelle commande à partir du trigger appelant. La procédure devrait trouver le numéro d'employé approprié dans la table CUSTOMER et mettre à jour l'enregistrement du vendeur dans la table EMP, ajoutant la nouvelle commission à la valeur existante. Considérez pour cet exercice un taux de commission fixe de 5 %. b. Créez, dans la table ORD, un trigger de ligne qui appellera la procédure et y transférera les paramètres requis. c. Utilisez deux procédures de package pour modifier la commande de client : UPD_ITEM et ADD_ITEM dans le package ITEM_PACK. Vous trouverez, dans votre répertoire de travail, p8_3.sql, un script permettant de créer le package ITEM_PACK. Utilisez ces deux procédures pour modifier la commande du client. SQL> EXECUTE ITEM_PACK.ADD_ITEM (610, 4, 102130, 3.4,1) SQL> EXECUTE ITEM_PACK.UPD_ITEM (610, 2, -1) d. Une fois la commande 610 modifiée, assurez-vous que la commission de WARD a bien été augmentée de 0,03 unité. La commission initiale était de 500. Développer des unités de programmes PL/SQL 8-39

Développer des unités de programmes PL/SQL 8-40